虚拟内存
为什么要建立虚拟内存
- 为了防止不同进程同一时刻在物理内存中运行而对物理内存抢夺,采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中,所看到得是自己占有了当前系统得4G内存。所有进程共享同一物理内存,每个进程只把自己目前所需要得虚拟内存通过文件管理单元映射到物理内存上。事实上,虚拟内存对应位置的程序没有立即映射到物理内存上,只是建立好虚拟内存和磁盘文件之间的映射(存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的表项做相应的设置,当进程真正访问此数据时,才引发缺页异常。
虚拟内存的好处
- 扩大地址空间;
- 内存保护:每个进程之间运行在各自的虚拟内存地址空间,互相不能干扰对方,虚拟内存还对特定的内存提供写保护,可以防止代码或数据被篡改。
- 公平分配内存,采用了虚拟内存之后,每个进程都拥有一样大的虚拟内存空间。
- 可以实现内存共享,方便了进程间通信
- 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要分配连续物理空间,可以充分利用碎片。
- 不同的进程使用同样的代码时,比如库文件中的代码,物理内存只需要存储一份这样的代码,不同的进程只需把自己的虚拟内存映射到物理内存就行,可以节省内存。
虚拟内存的弊端
- 虚拟内存的管理需要建立很多的数据结构,这些数据结构占用了很多额外的内存
- 虚拟地址到物理地址的切换,增加了指令的执行时间
- 虚拟地址到物理地址的切换,增加了指令的执行时间
- 如果一页中数据只有一部分,回浪费内存
虚拟地址怎么映射到物理地址
-
操作系统为每一个进程维护了虚拟地址到物理地址映射关系的数据结构,叫做页表。页表的内容就是虚拟地址到物理地址的一个映射。页表中的每一项都记录了该页的基地址。
-
三级页表转换方法:(两步)
(1)逻辑地址转线性地址:段起始地址+段内偏移地址=线性地址 (2)线性地址转物理地址:
每一个32位的线性地址被划分为三部分:页目录索引(10位)、页表索引(10位)、页内偏移(12位)
- 从cr3中取出进程的页目录地址(操作系统调用进程时,这个地址被装入寄存器中)
- 页目录地址 + 页目录索引 = 页表地址
- 页表地址 + 页表索引 = 页地址
- 页地址 + 页内偏移 = 物理地址