【计算机内存体系】理解计算机内存,从位、字节到字,以及寻址的双重视角

这个系列视频只能说是小科普,up也是这么说的。
我都不知道该怎么写文章,大部分也是改改配音稿,再加上一些自己的问题······


原视频

引入:内存的分类

  1. 装机视角:实实在在的内存条
  2. 操作系统视角:更多谈及的是 虚拟内存
  3. 硬件视角:物理内存
  4. 电路视角:内存电路

  当然,这些仅是简单的分类,在实际应用中,其维度远不止这些。

  首先会介绍 基本的内存模型,然后了解 “字节” 与 “地址空间” 的定义,接下来会深入到地址的计算及 “字” 的概念,最后将从双重角度详解寻址技术。

pirgJT1.jpg

物理内存的模型

  目前有一个处理器和一个固态硬盘。由于处理器的计算速度和硬盘的读取速度相差悬殊,就需要通过内存来缓解这种速度差异。例如当我们启动一个大型游戏时,系统会先将游戏的关键数据加载到内存中,这样可以大大减少游戏的加载时间。

  当处理器需要读取数据时,它会通过特定的地址访问内存,而内存会将对应地址的数据返回给处理器。同样地,在写入数据时,处理器会将目标地址和待写入的数据一同交给内存。从中我们可以看出,地址和数据无疑是内存操作中两个最为核心的概念。

  内存的模型通常被比喻为一个巨大的快递柜,每个格子都有唯一的编号,这就是 “地址” 。而格子里放置的物品,代表了 “数据” 。许多教科书将内存形容为一个字节数组,或者说,是一个按字节进行编址的存储空间。在这个空间中,每一行可以看作是一个字节。

字节与地址空间

  那么,什么是字节呢?如果放大观察一个字节,会发现它由八个 “位” 组成。在计算机科学中,位是最基本的存储单元,只能为 0 或 1。这样,一字节就等于八位。现在,考虑位的组合。一个位能表示两种状态,即 0 和 1,因此有两个可能的地址。两个位可以表示的地址为 00, 01, 10, 11,共四个地址。而三个位则有八种组合方式,从 000 到 111,代表八个不同的地址。

  可以推出通用的表达形式。分别转换为数学的表达形式,再转换为对数表达形式。当画出该函数的图像时,会发现图上的点与先前提及的数学表达形式和左边方框内的内容相一致,这为我们提供了一个直观的方法来理解位与地址之间的关系。

pirgBOH.jpg

字与地址计算

  接下去,让我们看看一个 64 字节的内存。当按字节编址,每一行代表一个字节,这意味着我们有 64 行。使用之前的表达式,可以确定需要 6 位来唯一标识这64个地址。当我们将这 6 位二进制数转换为十进制时,结果就是你要访问的内存地址。而仅仅改变其中一位,就可以得到不同的地址。

pirg2ff.jpg pir219f.jpg

  在了解了地址计算之后,我们来看看字的概念。字并没有固定的大小,可以让 1 个字等于 1 个字节,这样的话该模型的 1 行就是 1 个字,和上面的一样,需要通过 6位 来访问所有的地址。而现在如果令 1 个字等于 4 个字节,那就相当于 4 行为 1 个字——标上序号,可以计算出需要 4 位来访问这 16 个序号,同样可以展开计算出十进制,从而得到访问的序号。现在不妨将这 4 行压成 1 行,就像这样,此时依然是 64 个字节大的内存,但其中的一格代表了字节,而此时的一行就代表一个字,里面是32个位。

pir2MNt.jpg

  6 位能够访问 64 个地址,而 4 位只能访问 16 个,那么这两者之间的 2 位差异意味着什么呢?

pir2KAI.jpg

寻址的双重视角

  重新整理一下目前的情报。内存大小是 64 个字节,使用这一个模型,其中的 1 格为 1 个字节,需要 6 位来访问 64 个格子,一行包括了 4 个字节,需要使用 4 位来访问 16 行。

pir2Q4P.jpg

  仔细看下每一行的内存,一共 4 列,那使用 2 位不就正好能够访问这 4 列吗?我们可以来验证一下,在模型上面标上二进制表达形式。首先计算 6 位的结果,对应的就是其中的一个格子,再计算 4 位的结果,对应的是模型的一行,最后直接可以将 2 位的对应到模型上面标出的表达式中,我们就能发现,通过 6 位访问,与分别通过 4 位和 2 位访问,结果是一致的,可以转换一下其中的数字再来验证。

  目前变换的只是 2 位里的数字,而其实变换 4 位里的数字也是一样的。现在如果想要访问 25 号的地址,我们可以反推得到 6 位的表达式,其对应的行和列也能得到该地址,实际上这 6 位的数字和 4 位加上 2 位的数字始终是一致的,不同的只是我们如何去理解其中的位数。

  这种思考方式在内存中并不少见,不只是在缓存的映射方式中能找到,在虚拟内存中同样也有类似的思想。

pir2nHA.jpg

扩展