在第五章的学习中,主要理解虚拟存储器的基本概念和它的具体实现方法,当然也需要朋友们对请求分页系统的基本原理知识有所了解,看这篇文章的时候,会更加能够吸收相应的“简答”题型或者是会“计算”相应的题型。本章的内容参考《计算机操作系统》(第四版 汤子瀛)的书籍相应章节。阿婆主只是知识的搬运工~
目录(检索你需要知道的知识点)
第五章操作系统的基础知识点
5.1 虚拟存储器基本概念中的典型问题分析
5.1.1 什么是虚拟存储器?如何实现页式虚拟存储器?
5.1.2 “整体对换从逻辑上也扩充了内存,因此也实现了虚拟存储器的功能”这种说法是否正确,请说明理由。
5.2 请求分页/段系统中的典型问题分析
5.2.1 在请求分页系统中,为什么说一条指令执行期间可能产生多次缺页中断?
5.2.2 在置换算法中,LRU和LFU哪个更常用?为什么?
5.2.3 在一采取局部置换策略的请求分页系统中,分配给某个作业的内存块数为4,其中存放的四个页面的情况如下表所示...
5.2.4 在一个请求分页系统中,假如一个作业的页面走向为4,3,2,1,4,3,5,4,3,2,1,5,目前它还没有任何页装入内存,当分配给该作业的物理块数目M分别为3和4时,请分别计算采用LRU和FIFO页面淘汰算法时,访问过程中所发生的缺页次数和缺页率,并比较所得的结果。
5.2.5 某页式虚拟存储管理系统中,页面大小为1K字节,一进程分配到的内存块数为3,并按下列地支顺序引用内存单元:3635,3632,1140,3584,2892,3640,0040,2148,1700,2145,3209,0000,1102,1100。如果上述数字均为十进制数,而内存中尚未装入任何页,请:
(1)给出使用LRU算法时的缺页次数,并与使用FIFO算法时的情况进行比较;
(2)用流程图的方式解释地址变换的过程(缺页时只需指出产生缺页中断以请求调页,具体的中断处理流程不需画出)。
5.2.6 有一二维数组:
VAR A:ARRAY[1..100,1..100] OF integer;
按先行后列的次序存储。对一采用LRU置换算法的页式虚拟存储器系统,假设每页可存放200个整数。若分配给一个进程的内存块数为3,其中一块用来装入程序和变量i、j,另外两块专门用来存放数组(不作他用),且程序段已在内存,但存放数组的页面尚未装入内存。请分别就下列程序,计算执行过程中的缺页次数。
5.2.7 某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。假定某时刻系统为用户的第0、1、2、3页分配的物理块号为5、10、4、7,而该用户作业的长度为6页,试将十六进制的虚拟地址0A5C、103C、1A5C转换成物理地址。
5.2.8 考虑一个请求调页系统,它采用全局置换策略和平均分配内存块的算法(即,若有m个内存块和n个进程,则每个进程分得m/n个内存块)。如果在该系统中测得如下的CPU和对换盘利用率,请问能否增加多道程序的度数来增加CPU的利用率?为什么?
5.2.9 现有一请求调页系统,页表保存在寄存器中。若一个被替换的页未被修改过,则处理一个缺页中断需要8毫秒;若被替换的页已被修改过,则处理一个缺页中断需要20毫秒。内存存取时间为1微妙,访问页表的时间可忽略不计。假定70%被替换的页被修改过,为保证有效存取时间不超过2微妙,可接受的最大缺页率是多少?
5.2.10 假如一个程序的段表如下表,其中存在位为1表示段在内存,存区控制字段中W表示可写,R表示可读,E表示可执行。对下面可执行。对下面的指令,在执行时会产生什么样的结果?
5.2.11 请求分页管理系统中,假设某进程的页表内容如下表。 页面大小为4KB,一次内存的访问时间是100ns,一次快表(TLB)的访问时间是10ns,处理一次缺页的平均时间为108ms(已含更新TLB和页表的时间),进程的驻留集大小固定为2,采用LRU置换算法和局部淘汰策略。假设a、TLB初始为空;b、地址转换时先访问TLB,若TLB未命中,再访问页表(忽略访问页表之后的TLB更新时间);c、有效位为0表示页面不再内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。设有虚地址访问序列2362H、1565H、25A5H,请问依次访问上述三个虚地址,各需多少时间?给出计算过程。
第五章操作系统的基础知识点
5.1 虚拟存储器基本概念中的典型问题分析
5.1.1 什么是虚拟存储器?如何实现页式虚拟存储器?
答:虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储系统。从用户观点看,虚拟存储器具有比实际内存大得多的容量,其逻辑容量由逻辑地址结构以及内存和外存容量之和决定,其运行速度接近于内存的速度,而每位成本却又接近于外存。
为实现虚拟存储器,首先需要扩充页表,增加状态位以指出所需页是否在内存,增加外存始址以便调入页面,增加引用位以供置换算法用,增加修改位使得换出时减少写入磁盘次数。另外,还要使用以下两种关键技术。
(1)请求调页技术。该项技术是指及时将进程所要访问的、不在内存中的页调入内存。该功能是由硬件(缺页中断机构发现缺页)和软件(将所需页调入内存)配合实现的。
(2)置换页技术。该项技术是指当内存中已无足够空间用来装入即将调入的页时,为了保证进程能继续运行,系统必须换出内存中的部分页,以腾出足够的空间。具体的置换操作并不复杂,其关键是应将哪些页换出,即采取什么置换算法。
5.1.2 “整体对换从逻辑上也扩充了内存,因此也实现了虚拟存储器的功能”这种说法是否正确,请说明理由。
答:上述说法是错误的。整体对换将内存中暂时不用的某个程序及其数据换出至外存,腾出足够的内存空间以装入在外村中的、具备运行条件的进程所对应的程序和数据。虚拟存储器是指仅把作业的一部分装入内存便可运行作业的存储器系统,它的实现必须建立在离散分配的基础上。虽然整体对换和虚拟存储器均能从逻辑上扩充内存空间,但整体对换不具备离散型,实际上,在具有整体对换功能的系统中,进程的大小仍将受到实际内存容量的限制。
5.2 请求分页/段系统中的典型问题分析
5.2.1 在请求分页系统中,为什么说一条指令执行期间可能产生多次缺页中断?
答:因请求调页时,只要作业的部分页在内存,该作业就能执行,而在执行过程中发现所要访问的指令或数据不在内存时,则产生缺页中断,将所需的页面调入内存。在请求调页系统中,一条指令(如 copy A to B)可能跨了两个页,而其中要访问的操作数可能与指令不在同一个页上,且操作数本身也可能跨了两个页。当要执行这类指令,而相应的页都不在内存时,就将产生多次缺页中断。
5.2.2 在置换算法中,LRU和LFU哪个更常用?为什么?
答:LRU置换算法比LFU置换算法更常用。
置换算法总是希望被换出的页(段),在不久的将来再被访问的概率尽可能小。然而LFU算法往往不能实现这一点。因为在LFU算法中,某页被访问的次数是用计数器计数的,在有些情况下,刚被调入的页(段)由于局部性原理,可能立即被访问多次,因而其计数器的计数值会很大;但过了这一小段时间后,该页(段)又不再被访问。这样,在根据置换算法确定的原则选择某一页(段)将之换出时,这样的页(段)会被留在内存中,而将其他页(段)换出去。如此被调出的页(段),虽然在刚才一段时间内其被访问次数的计数值较小,但有可能马上又要访问。可见,LFU算法的置换选择可能导致较坏的选择。
但在LRU算法中,由于是选择最近最久未被访问的页(段)置换出去,即预计在最近的将来该页被访问的概率也很小。所以,这种置换算法可能导致较好的选择,这使LRU算法或其近似算法,获得了较好的应用。
5.2.3 在一采取局部置换策略的请求分页系统中,分配给某个作业的内存块数为4,其中存放的四个页面的情况如下表所示:
物理块 | 虚页号 | 装入时间 | 最后一次访问时间 | 访问位 | 修改位 |
---|---|---|---|---|---|
0 | 2 | 60 | 157 | 0 | 1 |
1 | 1 | 160 | 161 | 1 | 0 |
2 | 0 | 26 | 158 | 0 | 0 |
3 | 3 | 20 | 163 | 1 | 1 |
表中的所有数字均为十进制数,所有时间都是从进程开始运行时,从0开始计数的时钟数。请问,如果系统采用下列置换算法,将选择哪一页进行换出?
(1)FIFO算法;
(2)LRU算法;
(3)改进的Clock算法。
分析:FIFO算法即先进先出算法,它选择最先装入内存的页面进行换出;LRU算法即最近最久未用置换算法,它选择最近最长时间没被使用的页面进行换出;改进的Clock算法是一种常用的LRU近似算法,它优先选择访问位和修改位均为0的页面进行换出。
答:(1)FIFO算法选择的换出页是物理块3中的第3页。
(2)LRU算法选择的换出页是物理块0中的第2页。
(3)改进的Clock算法选择的换出页是物理块2中的第0页。
5.2.4 在一个请求分页系统中,假如一个作业的页面走向为4,3,2,1,4,3,5,4,3,2,1,5,目前它还没有任何页装入内存,当分配给该作业的物理块数目M分别为3和4时,请分别计算采用LRU和FIFO页面淘汰算法时,访问过程中所发生的缺页次数和缺页率,并比较所得的结果。
分析:如果所访问的页还没装入内存,便将发生一次缺页中断,访问过程中发生缺页中断的次数就是缺页次数,而缺页的次数除以总的访问次数,就是缺页率。
答:(1)使用LRU算法时,访问过程中发生缺页的情况为:当M=3时,缺页次数为10,缺页率为10/12(如下表1);当M为4时,缺页次数为8,缺页率为8/12(如下表2)。可见,增加分配给作业的内存块数,可减少缺页次数,从而降低缺页率。
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
缺页(Y/N) | Y | Y | Y | Y | Y | Y | Y | N | N | Y | Y | Y |
最近最长时间未用的内存页 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | ||
4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | ||
最近刚使用过的内存页 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
被换出的页 | 4 | 3 | 2 | 1 | 5 | 4 | 3 |
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
缺页(Y/N) | Y | Y | Y | Y | N | N | Y | N | N | Y | Y | Y |
最近最长时间未用的内存页 | 4 | 3 | 2 | 1 | 1 | 1 | 5 | 4 | 3 | |||
4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | |||
4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | ||
最近刚使用过的内存页 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
被换出的页 | 2 | 1 | 5 | 4 |
(2)使用FIFO算法时,访问过程中发生缺页的情况为:当M=3时,缺页次数为9,缺页率为9/12(如下表3);当M为4时,缺页次数为10,缺页率为10/12(如下表4).可见,增加分配给作业的内存块数,反而增加了缺页次数,提高了缺页率,这种异常现象被称作Belady现象。
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
缺页(Y/N) | Y | Y | Y | Y | Y | Y | Y | N | N | Y | Y | N |
最早进入内存的页面 | 4 | 3 | 2 | 1 | 4 | 4 | 4 | 3 | 5 | 5 | ||
4 | 3 | 2 | 1 | 4 | 3 | 3 | 3 | 5 | 2 | 2 | ||
最晚进入内存的页面 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 5 | 5 | 2 | 1 | 1 |
被换出的页 | 4 | 3 | 2
| 1
| 4 | 3
|
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
缺页(Y/N) | Y | Y | Y | Y | N | N | Y | Y | Y | Y | Y | Y |
最早进入内存的页面 | 4 | 4 | 4 | 3 | 2 | 1 | 5 | 4 | 3 | |||
4 | 3 | 3 | 3 | 2 | 1 | 5 | 4 | 3 | 2 | |||
4 | 3 | 2 | 2 | 2 | 1 | 5 | 4 | 3 | 2 | 1 | ||
最晚进入内存的页面 | 4 | 3 | 2 | 1 | 1 | 1 | 5 | 4 | 3 | 2 | 1 | 5 |
被换出的页 | 4 | 3 | 2 | 1 | 5 | 4 |
5.2.5 某页式虚拟存储管理系统中,页面大小为1K字节,一进程分配到的内存块数为3,并按下列地支顺序引用内存单元:3635,3632,1140,3584,2892,3640,0040,2148,1700,2145,3209,0000,1102,1100。如果上述数字均为十进制数,而内存中尚未装入任何页,请:
(1)给出使用LRU算法时的缺页次数,并与使用FIFO算法时的情况进行比较;
(2)用流程图的方式解释地址变换的过程(缺页时只需指出产生缺页中断以请求调页,具体的中断处理流程不需画出)。
答:(1)根据题意,分配给作业的内存块数为3,而页面的引用次序为3、3、1、3、2、3、0、2、1、2、3、0、1、1。因此,可以计算出,采用LRU算法时,缺页次数为8;采用FIFO算法时,缺页次数为6.
LRU算法用最近的过去作为预测最近的将来的依据,因为程序执行的局部性规律,一般有较好的性能,但实现时,要记录最近在内存的每个页面的使用情况,比FIFO算法困难,其开销也大。有时,因页面的过去和未来的走向之间并无必然的联系,如上面,LRU算法的性能就没想象中那么好。
(2)地址变换的流程图如下(摘自书中)。
图 地址变换流程图
5.2.6 有一二维数组:
VAR A:ARRAY[1..100,1..100] OF integer;
按先行后列的次序存储。对一采用LRU置换算法的页式虚拟存储器系统,假设每页可存放200个整数。若分配给一个进程的内存块数为3,其中一块用来装入程序和变量i、j,另外两块专门用来存放数组(不作他用),且程序段已在内存,但存放数组的页面尚未装入内存。请分别就下列程序,计算执行过程中的缺页次数。
程序 1:
FOR I := 1 TO 100 DO
FOR j := 1 TO 100 DO
A[i,j] := 0
程序 2:
FOR j := 1 TO 100 DO
FOR i := 1 TO 100 DO
A[i,j] := 0
答:对程序1,首次缺页中断(访问A[0,0]时产生)将装入数组的第1、2行共200个整数,由于程序是按行对数组进行访问的,只有在处理完200个整数后才会再次产生缺页中断;以后每调入一页,也能处理200个整数,因此,处理100*100个整数共将发生50次缺页。
对程序2,首次缺页中断同样将装入数组的第1、2行共200个整数,但由于程序是按列对数组进行访问的,因此在处理完2个整数后又会再次产生缺页中断;以后每调入一页,也只能处理2个整数,因此,处理100*100个整数共将发生5000次缺页。
5.2.7 某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。假定某时刻系统为用户的第0、1、2、3页分配的物理块号为5、10、4、7,而该用户作业的长度为6页,试将十六进制的虚拟地址0A5C、103C、1A5C转换成物理地址。
答:由题目所给条件可知,该系统的逻辑地址有15位,其中高5位为页号,低10位为页内地址;物理地址有14位,其中高4位为块号,低10位为块内地址。另外,由于题目中给出的逻辑地址是十六进制数,故可先将其转换成二进制数以直接获得页号和页内地址,再完成地址的转换。
(1)如下图,逻辑地址(0A5C)的页号为(00010),即2,故页号合法;从页表中找到对应的内存块号为4,即(0100);与页内地址(10 0101 1100)拼接形成物理地址(010010 0101 1100),即(125C)。
图 十六进制的地址转换
(2)逻辑地址(103C)的页号为4,页号合法,但该页未装入内存,故产生缺页中断。
(3)逻辑地址(1A5C)的页号为6,为非法页号,故产生越界中断。
5.2.8 考虑一个请求调页系统,它采用全局置换策略和平均分配内存块的算法(即,若有m个内存块和n个进程,则每个进程分得m/n个内存块)。如果在该系统中测得如下的CPU和对换盘利用率,请问能否增加多道程序的度数来增加CPU的利用率?为什么?
(1)CPU的利用率为13%,盘利用率为97%;
(2)CPU的利用率为87%,盘利用率为3%;
(3)CPU的利用率为13%,盘利用率为3%;
答:(1)这种情况表示系统在进行频繁的置换,已致绝大部分时间被花在页面置换上,此时,增加多道程序的度数会进一步增加缺页率,是系统性能进一步恶化,所以,不能用增加多道程序的度数来增加CPU的利用率,反而应减少内存中的作业道数。
(2)在这种情况下,CPU的利用率已相当高,但对换盘的利用率却相当低,这表示运行进程的缺页率很低,可以适当增加多道程序的度数来增加CPU的利用率。
(3)在这种情况下,CPU的利用率相当低,而且对换盘的利用率也非常低,表示内存中可运行的程序数不足,此时,应该增加多道程序的度数来增加CPU的利用率。
5.2.9 现有一请求调页系统,页表保存在寄存器中。若一个被替换的页未被修改过,则处理一个缺页中断需要8毫秒;若被替换的页已被修改过,则处理一个缺页中断需要20毫秒。内存存取时间为1微妙,访问页表的时间可忽略不计。假定70%被替换的页被修改过,为保证有效存取时间不超过2微妙,可接受的最大缺页率是多少?
答:如果用p表示缺页率,则有效访问时间不超过2微妙可表示为:
(1-p)*1 us + p*(0.7*20ms + 0.3*8ms + 1us) <= 2us
因此可计算出:p<= 1/16400 (=0.00 006),即可接受的最大缺页率为0.00006。
5.2.10 假如一个程序的段表如下表,其中存在位为1表示段在内存,存区控制字段中W表示可写,R表示可读,E表示可执行。对下面可执行。对下面的指令,在执行时会产生什么样的结果?
(1)STORE R1,[0,70]
(2)STORE R1,[1,20]
(3)LOAD R1,[3,20]
(4)LOAD R1,[3,100]
(5)JMP [2,100]
段号 | 存在位 | 内存始址 | 段长 | 存取控制 | 其他信息 |
---|---|---|---|---|---|
0 | 0 | 500 | 100 | W | |
1 | 1 | 1000 | 30 | R | |
2 | 1 | 3000 | 200 | E | |
3 | 1 | 8000 | 80 | R | |
4 | 0 | 5000 | 40 | R |
分析:在执行指令的过程中,如果指令中包含有地址部分,则先必须进行逻辑地址到物理地址的转换。在地址转换过程中还要进行越界检查和存取控制权限的检查,只有在地址不越界、访问方式也合法,并形成物理地址后,才能去完成指令规定的操作。
答:(1)指令STORE R1,[0,70]。从段表的第0项可读出第0段的存在位为0,表示相应段未装入内存,因此地址变换机构将产生一缺段中断,以请求OS将其调入内存。
(2)指令STORE R1,[1,20]。从段表的第1项可以看出,虽然指令中的逻辑地址合法、段也在内存,但本指令对内存的访问方式(写)与存取控制字段(只读)不符,故硬件将产生保护性中断信号。
(3)指令LOAD R1,[3,20]。从段表的第3项可读出第3段的存在位为1,内存始址为8000,段长为80,存取控制为R,因此,逻辑地址合法,访问方式也合法,形成物理地址8020后,指令将把该单元的内容读到寄存器R1中。
(4)指令LOAD R1,[3,100]。从段表的第3项可读出第3段的存在位为1,内存始址为8000,段长为80,存取控制为R,因此,指令的逻辑地址中段内地址超过了段长,地址变换机构将产生越界中断信号。
(5)指令JMP [2,100]。从段表的第2项可读出第2段的存在位为1,内存始址为3000,段长为200,访问权限为E,因此逻辑地址与访问方式都合法,形成物理地址3100,指令执行后,将跳转到内存单元3100处继续执行。
5.2.11 请求分页管理系统中,假设某进程的页表内容如下表。
页号 | 页框(Page Frame)号 | 有效位(存在位) |
---|---|---|
0 | 101H | 1 |
1 | -- | 0 |
2 | 254H | 1 |
页面大小为4KB,一次内存的访问时间是100ns,一次快表(TLB)的访问时间是10ns,处理一次缺页的平均时间为108ms(已含更新TLB和页表的时间),进程的驻留集大小固定为2,采用LRU置换算法和局部淘汰策略。假设a、TLB初始为空;b、地址转换时先访问TLB,若TLB未命中,再访问页表(忽略访问页表之后的TLB更新时间);c、有效位为0表示页面不再内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。设有虚地址访问序列2362H、1565H、25A5H,请问依次访问上述三个虚地址,各需多少时间?给出计算过程。
答:(1)逻辑地址2362H:页号为2,页内地址为362H。先访问TLB(10ns),未命中;再去访问页表(100ns),获得对应的物理块号254H,从而拼接成物理地址254362H,同时将第2页的信息装入TLB中;最后根据这个物理地址访问内存(100ns)。故访问到虚地址对应单元的数据总共需要210ns。
(2)逻辑地址1565H:页号为1,页内地址为565H。先访问TLB(10ns),未命中;再去访问页表(100ns);存在位为0,因此产生缺页中断,中断处理的时间为108ms,在中断处理时,因为内存已满,须淘汰一个内存页,LRU算法将选择淘汰第0页,然后将第101H号页框分配给第一页,并以此更新TLB和页表;接着重新执行指令,访问TLB(10ns)便可得到页对应的物理块号101H,与页内地址为565H拼接成物理地址101565H,最后根据这个物理地址访问内存(100ns)。总共需要:10ns+100ns+108ms+10ns+100ns =(约等于) 108ms。
(3)逻辑地址25A5H:页号为2,页内地址为5A5H。先访问TLB(10ns),命中(在访问2362H时已将该页信息装入TLB),获得对应的物理块号254H,从而拼接成物理地址2545A5H;最后根据这个物理地址访问内存(100ns).故总共需要110ns。
锲而舍之,朽木不折;锲而不舍,金石可镂。