虚拟内存管理
为什么要引入虚拟内存?
我们知道,一个程序代码运行是需要内存空间的,由于在多道程序并发执行环境下,对内存的需求增大,所以我们要扩充内存。
又因为内存本身造价昂贵,一条金士顿 32GB DDR4 在京东购买就要900块左右,即使我们插满4条,也不过128GB内存,没办法同时运行几个大型游戏
在物理上扩展内存相对有限的情况下,我们尝试在逻辑上扩充内存,其主要原理就是利用局部性原理。
简单说打开游戏,玩家进入某个场景,只需要加载当前场景的资源到内存即可运行,每次切换场景,就加载对应场景数据,从而不用把这个游戏全部的程序代码放到内存。
虚拟内存容量大小
虚存的容量要满足2个条件
- 虚存的实际容量 =< 内存容量 + 外存容量,其实很好理解,外存可以存放当前运行游戏没有用到的程序代码,看做缓冲
- 虚存的最大容量 =< 计算机地址位数能容纳的最大容量,假设你的计算机地址是32位,按字节编址,那么1个地址代表1个字节存储空间,那么虚存最大容量就是2^32个字节
实际虚存的容量取2个条件的交集
虚拟内存怎么解决问题
虚拟内存使用外存上的空间扩充内存空间,当访问的信息不在内存时,则产生缺页中断,这个时候由操作系统的缺页中断处理程序,将需要的数据从外存调入内存,这个过程就是请求调页功能
如果请求调页时,内存空间已经满了,则要选择替换老的页面数据,这个就是页面置换功能,分别有:
-
最佳置换算法OPT(optimal)
-
先进先出置换算法FIFO(first input first output)
-
最近最久未使用置换算法LRU(least recently)
-
时钟置换算法clock
-
改进型的时钟置换算法
引入虚拟内存会带来什么问题
因为虚拟内存技术页面调入、页面调出,需要访问外存,这么一来就会导致平均访存的时间增加,而且如果使用了不合适的页面置换算法,会大大降低系统的性能。