1. 背景
之前的内存管理方法需要进程在执行之前将整个进程放在内存中。虚拟内存技术允许执行进程不必完全在内存中。这使得程序可以大于内存的大小。
特点
① 将逻辑内存和物理内存分开
② 允许文件或内存通过共享页为多个进程共享
(1)虚拟地址空间
进程如何在内存中存放的逻辑视图
(起始仔细看看,它很像进程的PCB)
理解:
① 栈堆之间的空白空间为虚拟地址的一部分,只有栈和堆生长时,才需要实际的物理页。
② 稀地址空间:包含空白的虚拟地址空间
(2)共享页
① 通过将共享对象映射到虚拟地址空间,系统库可为多个进程共享。库按照只读的方式链接每个进程。
② 虚拟内存允许进程共享内存。允许进程创建内存区域,用于进程间共享
③ 允许系统调用for()创建进程进行期间的共享页
问题:为什么使用虚拟内存,它的优点是什么?
① 程序大小不受内存的限制: 进程不必完全装入内存
② CPU利用率提高: 每个程序占用的物理内存减少,更多的进程可以同时进行
③ 运行速度加快: 载入或交换程序到内存的I/O次数减少
③ 允许文件或内存通过共享页为两个或多个进程共享
2. 按需调页
定义
对于按需调用虚拟内存,只有程序执行需要时才载入页,那些从未访问的页不会调入物理内存。
按需调页系统
① 进程驻留在第二级存储器上(通常是磁盘)
② 当需要执行进程时,使用懒惰交换。将进程执行需要页调入内存
纯粹按需调页
所有的页都不在内存中,就开始执行进程。会不断出现页错误直到所有的页均在内存中。
问题:交换程序与调页程序的区别
① 交换程序是对整个进程进行操作
② 调页程序是对单个页进行操作。
2.1 基本概念
调页程序不是调入整个进程,而是把那些必须的页调入内存。
(1)调页程序的优点
① 减少了交换时间
② 减少了所需的物理内存空间
当换入进程时,调页程序推测在该进程再次换出之前会用到那些页。因此需要一定形式的硬件支持来区分哪些页在内存里,哪些页在磁盘中。
(2)有效位-无效位
在页表中同时存储有效/无效位。
有效:相关页有效且在内存中
无效:相关页无效(不在进程的逻辑空间内)、页有效但在磁盘上
页错误陷阱:当进程需要执行和访问不在内存中的页时(分页硬件发现页设置为无效),会产生页错误陷阱,陷入操作系统。
当进程执行和访问驻留在内存中的页时,执行会正常进行。对标记无效的访问会产生“页错误陷阱(page-fault trap)”,陷入操作系统。
问题:如何处理页错误?
(3)处理页错误的步骤
①访问:进程执行和访问未装入内存的页时,分页硬件发现已设置了无效位,产生页错误陷阱。
②捕获页错误:产生中断,陷入操作系统,检查内部页表引用是否合法。若引用非法则终止进程,否则需要调入页面。
③装入失效页:找到一个空闲帧,调度一个磁盘操作,以便将所需的页调入刚分配的帧。
④重置页表
⑤重启因陷阱而中断的指令:这种重复的工作不会很多(小于一个完整指令)
问题:从局部性的角度说明按需调用的合理性
背景: 单个指令可能访问多个页的内存,从而一个指令可能产生多个页错误。这会产生无法接收的系统性能。
分析: 这种情况是极为少见的。
① 局部模型说明,进程执行时是从一个局部移向另一个局部。局部是一个经常使用页的集合。
② 在同一局部内,进程只会在所需页均装入内存之前发生页错误。
2.2 按需调页的性能
(1)有效内存访问时间
对于绝大数计算机系统而言,内存访问时间(ma)的范围为 10~200ns.
有 效 访 问 时 间 = ( 1 − p ) × m a + p × 页 错 误 时 间 有效访问时间 = (1-p)\times ma+p\times 页错误时间 有效访问时间=(1−p)×ma+p×页错误时间
其中,p为页错误的概率。
(2)页错误时间
主要有三部分组成:①处理页错误中断、②读入页、③重新启动进程。
问题:有效内存访问时间的计算方法
举例
设平均页错误处理时间为8ms,内存访问时间为200ns,则有效内存访问时间为
= ( 1 − p ) × 200 + p × 8000000 = 200 + 7999800 × p =(1-p) \times 200 + p \times 8 000 000 \\ =200+7999800 \times p =(1−p)×