原因
在以前的物理内存中,多个进程共享物理内存,所以要对每个进程进行分配,因此每个进程的可用物理内存就比较小,并且可能会相互影响。
有了虚拟内存之后
1、每个进程有了不依赖物理内存的虚拟地址内存,这个空间比可用的物理内存大的多
2、使得每个进程的虚拟地址空间是私有的、独立的,与其他进程的虚拟地址空间相互隔离,这就解决了多进程之间地址冲突的问题
局部性原理
-
时间局部性:被访问过一次的内存地址很可能在不远的将来会被再次访问
-
空间局部性:如果一个内存地址被访问过,那么与他临近的地址在不远的将来也很可能会被访问
虚拟内存地址翻译过程
1、每个CPU都有一个页目录基址寄存器,记录最高级页表的物理基地址。
2、1个进程就有1个页目录表,每个页目录表由1024个页目录项组成,每个页目录项(PDE)都对应一张页表,每个页表又由1024个页表项组成,虚拟地址空间中的每个虚拟页在页表中都有一个PTE与之对应
一个页目录可以映射的大小为:102410244KB
32位操作系统 前10位代表页目录中的位置,中间10位代表页表中的位置,后面12位代表偏移值
缓存
虚拟地址并不是一开始就分配好的(有专门的标志位),而是需要用到的时候才进行分配,有未分配、分配但未映射、正常页面三个状态,只有在程序调用malloc等内存获取接口时才会进行分配,要进行读写时,发现未映射的话会出发缺页异常,然后进行映射,映射完成后会变成正常页面
未了加快翻译速度,通常通过快表来进行缓存,先到缓存中取,没有的话再去内存中取映射关系,拿到映射关系后MMU再通过物理内存获取数据
虚拟地址是连续的,但是他们他们映射的物理没存没必要是连续的
当进程切换的时候,对应的缓存中的数据也就没有用了,因为任意时刻只能有一个进程在跑,这就是切换进程的消耗比较大的原因之一
页面换入换出
-
由于程序运行符合局部性原理,对于那些没有被经常使用的内存,可以将他们换出到内存之外,比如磁盘的swap分区
-
当物理内存足够时,操作系统会让尽可能多的页驻留在物理内存中,因为将内存中的数据写入磁盘是非常耗时的操作
网友评论