操作系统-虚拟内存

为什么要有虚拟内存

  1. 进程直接访问物理内存会产生不可预估的分析;
  2. 物理内存宝贵且十分有限;
  3. 分配时,连续分配会造成内存碎片,后续难以分配。

什么是虚拟内存

虚拟内存是在物理内存和进程中间的中间层,他为进程隐藏了物理进程的存在,从进程的视角看,它以为自己独享了内存,这个内存空间就是虚拟内存实现的。

内存管理

虚拟内存其实就是磁盘上的一片空间,当这个空间中的某一部分访问比较频繁的时候,就把这一部分加载到物理内存中,加快访问速度。最后从进程角度上来说,以为系统的内存又大又快,但其实大是通过磁盘实现的,而快是通过将页加载到物理内存实现的。

技术分析

虚拟内存的实现使用了一整套的机制,这里有三个重要的部分:

  1. 从虚拟内存到物理内存的转换—>页表
  2. 缺页中断
  3. 页面置换算法

页表

虚拟地址经过内存管理单元(MMU)的转换变成物理地址,然后再通过物理地址访问内存。一个虚拟地址的低位部分为页内偏移量,高位部分为页号。我们需要做的就是把高位的页号转换为这一页在物理内存中实际的首地址,而页表就可以帮我们实现这个功能。页表就是一个多层的索引,我们通过页表可以获得页首地址,通过拼接低位的页内偏移量,可以得到数据最终的物理地址。

作用

  1. 实现虚拟地址到物理地址的转换;
  2. 以页为单位的碎片化存储;
  3. 内存保护,页表可以存储进程对物理地址的访问权限;
  4. 实现了共享内存。

注意

  1. 内存映射由操作系统的内存管理单元(Memory Management Unit, MMU)管理操作;
  2. 页表中有一个有效位,来确定页是否被加载到物理内存中;
  3. 虚拟地址也被称为逻辑地址。

缺页中断

通过判断页表中的映射是否指向硬盘来判断需要的页是否被加载到物理内存中。而如果没有加载,则会引发缺页中断,大体来说,却也中断会将缺失的页加载到物理内存中,具体来说的话分为以下几点:

  1. 如果没有可用的物理内存,会先通过页面置换算法选出需要替换的页;
  2. 如果被替换的页面是脏数据,先把它写回到硬盘中;
  3. 从硬盘中读取页面到内存中;
  4. 更新页表的映射关系;
  5. 跳出异常处理程序,继续从中断指令处开始向下执行。

当缺页中断处理完后,会重新通过页表去读取数据。

页面置换算法

OPT(最佳置换算法)

淘汰以后不会使用的页面,理论上是最优算法,可以作为衡量的标准。

FIFO(先进先出算法)

淘汰掉最先进入内存的页面。

LRU(最近最少使用算法)

择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。

Clock(时钟置换算法)

最近未用算法。

LFU(最不常用算法)

置换具有最小使用次数的页面。

MFU(最常使用算法)

具有最小计数的页面可能刚刚被引入并且尚未使用。

总结

  1. 虚拟内存可以控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性;
  2. 虚拟内存可以结合磁盘和物理内存的优势为进程提供看起来速度足够快并且容量足够大的存储;
  3. 虚拟内存可以为进程提供独立的内存空间并引入多层的页表结构将虚拟内存翻译成物理内存,进程之间可以共享物理内存减少开销,也能简化程序的链接、装载以及内存分配过程。