虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
----维基百科
使用虚拟内存有很多优点,比如:
- 方便页共享
- 快速fork子进程
虚拟内存的实现很大程度上依赖于按需调页这一机制
按需调页
所谓按需调页是指程序在加载时并不是一次性把所有的内容都加载到内存中,而是在需要时才将该页载入到内存中。这种交换方式称为懒惰交换
这种机制类似于交换程序,需要注意的是,交换程序在赋存和内存间交换的是整个进程,而按需调页则使用的是调页程序,它交换的是进程中的某个页
可以在页表中添加一个有效位。该位有效时说明页在内存中,该页无效时,可能说明页无效(不在逻辑地址的范围内),或者说明页不在内存中
当程序试图访问不存在于内存中的页的时候,操作系统将产生页错误陷阱(page-fault trap)
处理该错误:
- 操作系统查看页表决定:
- 有效位是否有效.
- 无效且该页不在内存中.
- 得到一个空闲帧.
- 将页载入帧.
- 将页表中该项的有效位改为有效.
- 重新执行指令
注 什么是陷阱:
为了支持多任务和虚拟存储器等功能,80386及以上CPU 把外部中断称为“中断”(interrupt),把
内部中断称为“异常”(exception) 。与8086一样,它也最多处理256种中断和异常。
根据引起异常的程序是否可被恢复和恢复点的不同,又把异常分为三类:
- 故障(fault)
- 陷阱(trap)
- 中止(abort)
把对应的异常处理程序分别称为故障处理程序、陷阱处理程序和中止处理程序。
故障是在引起异常的指令之前,把异常通知给系统的一种异常。故障的特点是可以排除的。
例如,在执行一条指令时,如果发现它要访问的段不在内存中,那磨停止该指令的执行,并产生一个段不存在异常,对应的故障处理程序可通过从外存加载该段到内存的方法来排除故障。之后,原引起异常的指令就可以继续执行,就不再产生异常
陷阱是在引起异常的指令执行之后触发的一种异常。在转入异常处理程序时,引起陷阱的指令已完成。陷阱处理程序执行完,返回到引起陷阱指令的下一条指令。软中断指令INT n 是陷阱的例子。
中止是在系统出现严重的不可恢复的事件时触发的一种异常。产生中止后,正执行的程序不能恢复执行,系统要重新启动才能恢复正常运行状态
按需调页的性能
按需调页有很多好处,但同样对性能有一定影响
其计算分析过程不予详述,这里只介绍结论
有效访问时间(成功访问内存的时间)与页错误率直接相关,只要在页错误率很低的情况下,效率才不会收到过大的影响
页置换
上面中提到的4. 得到一个空闲帧.不一定成功...内存是有限的,不能保证有限的内存总有空闲的帧,当内存中没有空闲帧的时候,我们就要用页置换来置换出空闲帧
- 发现需要的页
- 找到一个空闲帧
- 如果有,就使用该帧
- 如果没有,就使用页替换算法找到一个该被替换的帧
- 将该帧的页写入内存,更新页表
- 继续进程
同时还可以设置一个修改位,只有当页被修改了之后,才会重新写入内存,如果没被修改,只需要单纯的舍弃该页(原本页的内容还在磁盘中)
网友评论