《深入理解计算机系统》(9)内存管理
1、物理和虚拟寻址
- 物理寻址
- 主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。CPU 访问内存最自然的方式就是使用物理地址,称为物理寻址。
- 下图是一个物理寻址的示例,该示例的上下文是一个加载指令,它读取从物理地址4开始的4个字节,并将它返回给CPU,CPU会将它放在一个寄存器里。
- 早期的PC、嵌入式微处理器、DSP等仍然使用的是物理寻址的方式。
- 虚拟寻址
- 现代 CPU 使用的是虚拟寻址:CPU 通过生成一个虚拟地址(VA)来访问主存,这个虚拟地址首先通过地址翻译转换为物理地址。
- 地址翻译需要 CPU 硬件和操作系统之间的紧密合作。CPU 芯片上名为内存管理单元(MMU)的专用硬件利用存放在主存中的查询表来动态翻译虚拟地址。
2、地址空间
- 地址空间(address space)
地址空间是一个非负整数地址的有序集合:{0, 1, 2, …} - 线性地址空间(linear address space)
地址空间中的整数是连续的 - 虚拟地址空间(virtual address space)
在计算机系统中,CPU 从一个有 N=2^n 个地址的地址空间中生成虚拟地址空间:{0, 1, 2, … ,N-1} 。一个地址空间的大小是由表示地址的位数来描述的,例如现代的 64 位计算机一般支持 64 位虚拟地址空间。 - 物理地址空间(physical address space)
对应系统中物理内存的M个字节:{0, 1, 2, … ,M-1},M不要求是2的幂,但我们假设M=2^m。
3、虚拟内存作为缓存的工具
- 虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。
- 磁盘上的数组内容被缓存在主存中。和存储器层次结构中的其他缓存一样,磁盘(较低层)中的数据被分割成块,作为磁盘和主存(较高层)之间的传输单元。
- 类似的,物理内存被分割为物理页(PP),大小也是 P 字节。物理页也被称为页帧。
- 任何时刻,所有的虚拟页都被分为了三个不相交的子集:
- 未分配的:VM 系统还未分配(未创建)的页。未分配的块没有任何数据与它们相关联,因此不占用任何磁盘空间。
- 已缓存的:当前已缓存在物理内存中的已分配页。
- 未缓存的:未缓存在物理内存中的已分配页。
图中展示了一个有8个虚拟页的小虚拟内存。虚拟页0和3还没有被分配,即在磁盘中不存在。虚拟页1、4和6被缓存在物理内存中。虚拟页2、5和7已经被分配,但并未缓存在主存中。
3.1、DRAM缓存的组织结构
- 主存一般采用 DRAM,DRAM 与磁盘之间的速度差要比 SRAM 与 DRAM 之间的速度差大很多,并且从磁盘的一个扇区读取第一个字节的时间开销比读这个扇区中的连续字节要慢很多。因此 DRAM 缓存的组织结构与高速缓存有很大不同。
- 因为严重的不命中处罚和访问第一个字节的开销,虚拟页一般很大,通常在 4KB~2MB,且 DRAM 缓存是全相联的,即任何虚拟页都可以放在任何的物理页中。不命中时的替换策略也很重要。
- 因为访问磁盘很慢,所以 DRAM 都采用写回(即延时写),而非直写。
3.2、页表
- VM 系统需要判定一个虚拟页是否缓存在 DRAM 中的某个地方,如果是需要确定虚拟页存放在哪个物理页中,如果不是需要判断虚拟页存放在磁盘的哪个位置;在 DRAM 中选择一个牺牲页并把虚拟页从磁盘复制到 DRAM 中替换这个牺牲页。
- 这些功能由操作系统软件、MMU 中的地址翻译硬件、页表共同完成:
- 页表(Page Table)是一个存放在 DRAM 中的数据结构,它将虚拟页映射到物理页。
- 每次地址翻译硬件将一个虚拟地址转换为硬件地址时都会读取页表。
- 操作系统负责维护页表的内容,以及在磁盘和 DRAM 间传送页。
- 页表是一个 页表条目(Page Table Entry,PTE) 构成的数组,虚拟地址空间中的每个页在页表中的一个固定偏移量处都有一个 PTE。可以认为 PTE 由一个有效位和一个 n 位地址字段组成。有效位表明该虚拟页是否被缓存在 DRAM 中。
- 对于三种不同的页,其页表条目的内容不同:
- 已缓存的页: 有效位=1,n 位地址字段表示该页在 DRAM 中相应的物理页的起始地址。
- 未缓存的页: 有效位=0,n 位地址字段表示该虚拟页在磁盘上的起始地址。
- 未分配的页: ss有效位=0,地址字段为空。
3.3、页命中
- 当 CPU 要读取上图中的 VP2 就会发生页命中。
- 地址翻译硬件使用虚拟地址作为索引从页表中查找相应的页表条目,然后读取条目中的内容来获取该虚拟页在 DRAM 中的物理地址。
3.4、缺页
- DRAM 缓存不命中称为缺页。如 CPU 要读取上图中的 VP3 时,会从页表条目的有效位发现该页没有被缓存。
- 当发生缺页会触发一个缺页异常。缺页异常会调用内核中的缺页异常处理程序,该程序会从已缓存的页中选择一个牺牲页。如果该牺牲页之前已经被修改,内核会先将它复制回磁盘(即写回),然后内核会占用它的物理页并修改它的页表条目为未缓存的。(注意下图指向VP4的PTE中的有效位置为0了)
- 缺页异常处理完成后,会重新启动导致缺页的指令,该指令重新进行对该虚拟地址的操作。
- 一些概念
- 在磁盘和内存之间传送页的活动叫做交换(swapping)或者页面调度(paging)。
- 页从磁盘换入DRAM和DRAM换出磁盘。
- 一直等待,直到有不命中发生时才换出页面的策略称为按需页面调度,该策略被所有现代系统使用。
3.5、分配页面
- 初始的虚拟地址空间中的虚拟页基本都是未分配的,当调用了
malloc
就会分配一个或一些新的虚拟页,这些页指向磁盘上的对应页面。
3.6、又是局部性救了我们
- 虚拟内存利用了局部性,局部性原则保证了在任意时刻,程序将趋向于在一个较小的活动页面集合(称为工作集)上工作。
- 通过将活动页面集合(称为工作集)缓存到 DRAM 中来减少出现缺页的情况。
- 如果工作集的大小超出了 DRAM 的大小,程序将会发生抖动,页面会不断地换进换出。
- 根据本节内容可以区分主存缓存与各高速缓存的组织结构的不同之处:
- 高速缓存将地址位划分为有效位、标记位、组索引位、块偏移位,通过组选择、行匹配、字抽取来完成对数据的操作。
- 主存采用了 VM 系统,使用页表来实现对数据的查找。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725615.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!