什么是虚拟内存
在现代的操作系统中,当你对内存地址进行操作时其实操作的并不是物理内存地址,而是系统虚拟出来的一个虚拟内存地址。
通过简单的图例说明虚拟内存的概念。
操作系统的物理内存是固定的,我们这里指的是RAM。当操作系统运行多个进程时,每个进程如果直接访问物理内存,那是不是就会出现你进程P1访问地址A时如果进程P2也访问该地址,那就会造成进程之间的冲突。所以当代操作系统引入了虚拟内存的概念。
在创建P1和P2进程时,操作系统会分别告诉它们我整个内存都是你的,可是事实上操作系统给它们画了大饼,其实它们得到的是内存地址是虚拟出来的。当P1访问其内部的A地址时,P1.A指向物理地址A中,当P2访问其内部的A地址时它以为它访问的是物理地址A,但其实操作系统通过MMU将它指向了物理地址B。甚至当P1和P2各自访问其内部地址B时,其实它们公用了物理地址C。操作系统这种欺骗的手段就是虚拟内存。这些虚拟地址到物理地址之间的地址映射是MMU来完成的,对于P1和P2都只需知道它们占据了整块内存而无需关系它们的每一个地址都映射到物理内存的哪一个地址上。
所以虚拟内存的好处就是:解决各个进程之间的地址访问冲突问题,所有的地址映射都由MMU来处理,发没发生冲突、如何解决冲突等问题也由MMU来处理,各个进程都无需关心。
使用虚拟内存能更方便地实现内存和数据的共享。例如在进程加载系统库时总是先分配一块内存,将磁盘中的库文件加载到这个内存中。在直接使用物理内存时由于物理内存地址唯一,所以即使系统发现同一个库在系统中加载了多次也无能为力,因为每个进程指定的加载内存不一样。使用了虚拟内存之后这个问题就迎刃而解,系统只需将进程的虚拟内存地址指向库文件所在的物理内存地址即可,就如上图中的P1.B和P2.B同时指向了物理地址C。
什么是MMU
我们知道通过虚拟内存机制,每个进程都以为自己占用了全部内存,进程访问内存时,操作系统都会把进程提供的虚拟内存地址转换为物理地址,再去对应的物理地址上获取数据。CPU 中有一种硬件,内存管理单元 MMU(Memory Management Unit)专门用来将虚拟内存地址翻译为物理内存地址。CPU 还为页表寻址设置了缓存策略,由于程序的局部性,其缓存命中率能达到 98%。
操作系统都是以字节Byte为单位,MMU是使用一张映射表来存储虚拟地址与物理地址之间的映射关系,那每存储一个条目都需要至少8个字节(32位虚拟地址–>32位物理地址),在32位且只有4G运存的设备上就至少需要32G的空间来存储这张对照表,显然这是不现实的,所以操作系统引入了页的概念。
MMU将虚拟内存划分成以