计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决
名词
- 虚拟地址(VA,Virtual Address)
- 物理地址(PA,Physical Address)
- 物理页(physical Page)
- 虚拟页(VP,Virtual Page)
- 磁盘页(DP,Disk Page)
早期的计算机直接访问物理内存,也就是说程序在运行的时候访问的地址都是物理地址,当出现多任务的CPU时就出现了内存空间不够的问题 比如内存大小 10MB 程序A总共需要使用5MB程序B总共需要使用6MB 这个时候内存空间就不够用了。同时会出现几种情况
- 地址空间不隔离
程序直接访问物理内存这样就可以很轻松的访问其他应用的内存空间了。
- 内存的使用效率低
每次都是将程序需要的内存空间全部开辟出来,很显然我们知道一个程序在运行的时候不会使用到全部的内存空间这样就出现了内存空间浪费。如果出现内存不够程序所需要的内存空间,则需要将其他的在运行的程序暂停将数据存放在磁盘,来运行当前出现,这样就有大量的数据在换入换出,程序运行效率非常的低下。
- 程序运行地址不确定
为了解决这个问题我们需要引入一个中间层 也就是虚拟内存。
最开始使用的是一种叫做分段的方法。
也就是让程序认为自己在0x000开始执行程序,实际上由操作系统进行将程序认为的地址转换为实际物理地址同时由操作系统监控程序运行状态如果程序访问地址超过程序申请大小则拒绝访问。这样解决了地址空间隔离程序、运行地址不确定的问题,但是内存使用效率低依然没有解决。
解决内存使用效率低的方法是:分页
操作系统将内存拆开为页,每页占固定大小,比如4KB。
将应用程序常用的代码和数据装载在内存中,将不常用的存放在磁盘里(程序始终认为数据存放在内存中,虚拟页和物理转换的整个过程由操作系统管理)
如果不常用的数据被引用会出现页错误(Page Fault)这个时候操作系统就会将数据装载到内存中。
一个样例:
虚拟内存技术也需要硬件的支持使用的是叫做MMU(Memory Management Unit)来进行页映射。
MMU集成在CPU中