1.物理寻址
计算机系统被组织成一个由M字节连续大小的单元组成的数组,每字节都有一个唯一的物理地址,CPU按照这种简单的线性地址结构进行地址访问,这就是物理寻址。
2.虚拟寻址
现代处理器采用的是一种虚拟寻址的形式。使用虚拟寻址,CPU通过生成一个虚拟地址(VA)来访问主存,这个虚拟地址被送到内存之前先转换成适当的物理地址。这个过程称为地址翻译。地址翻译需要CPU硬件和操作系统的配合,内存管理单元(MMU)利用存放在主存中的查询表来动态翻译虚拟地址。
3.虚拟内存
虚拟内存在概念上被组织成一个由存放在磁盘上的N个连续的字节大小的单元组成数组。每个字节都有一个唯一的虚拟地址,作为数组的索引。虚拟内存被划分成大小固定的块,称为虚拟页面。
在任意时刻,虚拟页面的集合都分为三个不相交的子集:
1. 未分配的,VM 系统还未分配(或者创建)的页,未分配的页没有任何数据和它们关联,因此不占用任何内存空间。
2. 缓存的,当前已缓存在物理内存中的已分配页。
3. 未缓存的,未缓存在物理内存中的已分配页。
4.页表
CPU进行地址访问时需要根据物理地址确定数据的位置,也就是说,虽然使用虚拟寻址方式,但是本质需要访问实际的物理地址,这也就需要通过MMU(内存管理单元)进行从虚拟地址到物理地址的翻译。也称之为虚拟内存到物理内存的映射,我们把这个映射表称为页表。
虚拟内存系统需要有某种方法来判定一个虚拟页是否在缓存DRAM中的某个地方。这时会出现两种情况:
- 虚拟页已经在主存中,此时需要判断虚拟页存储在主存的哪个物理页中。
- 虚拟页不在主存中,此时系统需要判断虚拟月存放在磁盘的什么位置,并且在主存中选择一个牺牲页,将虚拟页从磁盘复制到主存(DRAM)中,替换牺牲页。
页表将虚拟页映射到物理页,每次地址翻译硬件将一个虚拟地址转换到物理地址时,都会读取页表。
页表是一个页表条目(PTE)的数组,虚拟地址空间的每个页在页表中都有一个对一个的PTE,假设PTE由一个有效位和一个n位的地址段构成,有效位表示虚拟页是否被缓存在主存中。
- 有效位为1:主存缓存了虚拟页,地址字段表示主存中相应物理页的起始位置。
- 有效位为0:地址字段为null表示虚拟页还未被分配。否则该地址就指向该虚拟页在磁盘上的起始位置【已经被分配但是未被缓存】。
4.1页命中
当CPU读取虚拟内存中的内容时,地址翻译硬件将虚拟地址作为地址索引定位PTE(页表条目),并从内存中读取,这时可以开始匹配有效位,如果虚拟页缓存在主存中,此时利用PTE中的物理地址构造需要数据的物理地址。这就是页命中。
页表地址转换方法:将内存地址分成页号和偏移量两个部分。【后期总结】
如有需要参考:【页表地址转换】
4.2缺页
DRAM缓存不命中称为缺页。当CPU需要获取虚拟内存中的内容时,地址翻译硬件从内存中读取PTE,根据有效位推断虚拟页未被缓存,此时触发缺页异常。调用内核中的缺页异常处理程序,程序选择牺牲页进行替换。
然后内核就可以将虚拟页内容复制到物理页中,更新PTE。这时虚拟页就已经缓存在主存中了,也就可以正常命中。
4.3局部性提升虚拟内存工作效率
虚拟内存工作的很好的原因在于局部性的存在。程序运行过程中引用不同页面的总数可能超过物理内存的大小,但是局部性保证在任意时刻,程序趋向于在一个较小的活动页面集合上工作(工作集)。
如果工作集的大小超过了物理内存的大小,那么就会出现抖动状态。
局部性原理请参考:【局部性原理】
4.3.1抖动现象及解决方法
【现象】
在请求分页存储管理中,从主存(DRAM)中刚刚换出(Swap Out)某一页面后(换出到Disk),根据请求马上又换入(Swap In)该页,这种反复换出换入的现象,称为系统颠簸,也叫系统抖动。产生该现象的主要原因是置换算法选择不当。
【解决方案】
运用局部性原理优化页面置换算法。【后期继续总结】
如有需要参考:
【页面置换算法】
【页面置算法及c++实现】
【危害】
系统时间消耗在低速的I/O上,大大降低系统效率。进程对当前换出页的每一次访问,与对RAM中页的访问相比,要慢几个数量级。
参考
《深入理解计算机系统》
《现代操作系统》
虚拟内存