《现代操作系统(中文第三版)》课后习题——第三章 存储管理

第三章 存储管理

1.在图3-3中基址和界限寄存器含有相同的值16384,这是巧合,还是它们总是相等?如果这只是巧合,为什么在这个例子里它们是相等的?


答:这是一个巧合。基址寄存器的值为16384是因为程序恰好在地址16384上加载。程序可以在任何地方加载。界限寄存器为16384是因为程序具有16384字节的长度。程序可以有任意的长度。加载地址与程序长度相等仅仅是一种巧合。

2.交换系统通过紧缩来消除空闲区。假设有很多空闲区和数据段随机分布,并且读或写32位长的字需要10ns的时间,紧缩128MB大概需要多长时间?为了简单起见,假设空闲区中含有字0,内存中最高地址处含有有效数据。

答:由题意得,读或写每个字节需要10/4 = 2.5ns,且128 MB = 227字节,内存紧缩时,几乎整个内存都必须复制,也就是要求读出每一个内存字,然后重写到不同的位置。因此,对于每个字节的压缩需要 5ns。故总共需要的时间为 227×5 ns = 671ms 。

3.请比较用位图和链表两种方法来记录空闲内存所需的存储空间。128MB的内存以n字节为单元分配,对子链表,假设内存中数据段和空闲区交替排列,长度均为64KB。并假设链表中的每个结点需要32位的内存地址、16位长度和16位下一结点域。这两种方法分別需要多少字节的存储空间?哪种方法更好?

答:128 MB = 227字节。对于位图,用于存储管理需要227/8n字节,故总共需要 227+227/8n=227×(1+1/8n)字节;对于链表,用于存储管理需要 227 / 216(64KB)=211个节点,每个节点大小为需要(32+16+16)/8 = 8字节,故总共需要227+ 211×8= 227 + 214=227×(1 +1/(8×210) )字节;因此,当n <210字节(即1KB)时,位图>链表,则使用链表;当n > 1KB 时,位图 < 链表,则使用位图。

4.在一个交换系统中,按内存地址排列的空闲区大小是:10KB、4KB、20KB、18KB、7KB、9KB、12KB和15KB。对于连续的段请求:a)12KB;b) 10KB;c)9KB。使用首次适配算法,将找出哪个空闲区?使用最佳适配、最差适配、下次适配算法呢?

答:      首次适配: 20KB,10KB,18KB;

             最佳适配: 12KB,10KB,9KB;

             最差适配: 20KB,18KB,15KB;

             下次适配: 20KB,18KB,9KB。

5.对下面的每个十进制虚拟地址,分別使用4KB页面和8KB页面计算虚拟页号和偏移量:20000,32768,60000。

答:

虚拟地址

4KB页面(12为偏移量)

8KB页面(13为偏移量)

20000

100|111000100000

10|0111000100000

32768

1000|000000000000

100|0000000000000

60000

1110|101001100000

111|0101001100000

6.Inlel 8086处理器不支持虚拟内存,然而一些公司曾经设计过包含未作任何改动的8086 CPU的分页系统。猜想一下,他们是如何做到这一点的。提示:考虑MMU的逻辑位置。

答:他们制作了MMU,并连接在CPU与地址总线之间,这样从处理器进入MMU的地址全部被视为虚拟地址,并被转换为物理地址,然后被送到地址总线,映射到内存中。

7.考虑下面的C程序:

       intX[N];

       intstep = M; //M是某个预定义的常量

       for(int i = 0; i < N; i += step) X[i] = X[i] + 1;

a)如果这个程序运行在一个页面大小为4KB且有64 个TLB 表项的机器上时,M和N取什么值会使得内层循环的每次执行都会引起TLB失效?

b)如果循环重复很多遍,结果会和a)的答案相同吗?请解释。

答:

a)int占4B,M的最小值是1024,才能使内层循环的每次执行时都引起TLB失效,由于TLB有64个,所以N的值>64×M。

b)M的值应该大于1024才能在内层循环每次执行时引起TLB失效,但现在N的值要大于64K,所以X会超过256KB。当N的值足够大时,还是会引起TLB失效。

8.存储页面必须可用的磁盘空间和下列因素有关:最大进程数n,虚拟地址空间的字节数v,RAM的字节数r,给出最坏情况下磁盘空间需求的表达式。这个数量的真实性如何?

答:所有进程的整个虚拟地址空间为nv,这就是页面存储所需的。不过,可以在RAM中存储量为 r,因此需要的磁盘存储量仅为 nv-r。该量比实际所需的要大得多,因为极少有n个进程实际运行,而且这些进程也极少需要其最大允许的虚拟内存。

9.一个机器有32位地址空间和8KB页面,页表完全用硬件实现,页表的每一表项为一个32位字。进程启动时,以每个字l00ns的速度将页表从内存复制到硬件中。如果每个进程运行100ms(包含装入页表的时间)用来装人页表的CPU时间的比例是多少?

答:页大小为8KB,所以页内地址为13位,故页框有19位,可表示的物理空间有219个页框。只考虑单进程,运行之前把所有页框复制到硬件的时间为219×100ns=52.42ms,故装入页表的时间比例为52.4288/100×100%=52.42%。

10. 假设一个机器有48位的虚拟地址和32位的物理地址。

       a)假设页面大小是4KB,如果只有一级页表,那么在页表里有多少页表项? 请解释。

       b)假设同一系统有32个TLB表项,并且假设一个程序的指令正好能放入一个页,并且该程序顺序地从有数千个页的数组中读取长整型元素。在这种情况下TLB的效果如何?

答:

a)页面大小是4KB,即偏移量为12位,所以页表里的页表项有2^(48-12)=2^36个;

b)TLB访问的命中率达100%。在指令访问下一个页面之前读取数据的命中率是100%,一个4KB大小的页面包含1024个长整型数据,每访问1024个数据就会有一次TLB失效。

11.假设一个机器有38位的虚拟地址和32位的物理地址。

       a)与一级页表比较,多级页表的主要优点是什么?

       b)一个有16KB个页、4字节表项的二级页表,应该对第一级页表域分配多少位,对第二级页表域分配多少位?请解释原因。

答:

a)避免把全部页表保留在内存中。

b)2^38/2^14 = 2^24,故页面长度为2^24,需要24位偏移量,而二级页表的表项为4字节,故PT2 = 2 ,所以 PT1 = 38 - 2 - 24 = 12,因此,对第一级页表域分配12位,对第二级页表分配域2位。

12.一个32位地址的计算机使用两级页表。 虚拟地址被分成9位的顶级页表域、 11位的二级页表域和一个偏移量,页面大小是多少?在地址空间中一共有多少个页面?

答:偏移量=32-9-11 = 12(位),所以页面大小为:2^12 = 4KB,页面数为:2^20。

13.假设一个32位虚拟地址被分成a,b,c,d四个域。前三个域用于一个三级页表系统,第四个域d是偏移,页面数与这四个域的大小都有关系吗?如果不是,与哪些因素有关以及与哪些因素无关?

答:页面数只依赖于a,b和c的和,至于它们之间是如何划分是无关的。

14.一个计算机使用32位的虚拟地址,4KB大小的页面。程序和数据都位于最低的页面(0~4095),堆栈位于最高的页面。如果使用传统(一级)分页,页表中需要多少个表项?如果使用两级分页,每部分有10位,需要多少个页表项?

答:对于一级分页,2^32 / 2 ^12 = 2^20个表项;对于两级分页,2^10×4 = 2^12 个表项(顶级页表项,正文段、数据段和堆栈段二级列表)。

15.一台计算机的进程在其地址空间有1024个页面,页表保存在内存中。从页表中读取一个字的开销是5n。为了减小这一开销,该计算机使用了TLB,它有32个(虚拟页面,物理页框)对,能在1ns内完成查找。请问把平均开销降到2ns需要的命中率是多少?

答:1×x+(1-x)×(5+1)=2,解得:x=80%。

16. VAX机中的TLB中没有包含R位,为什么?

答:TLB并不需要R位。只要页面存在,就表示页面已被引用;否则不会存在。因此这个位是完全冗余的。然而,当条目被写回内存时,内存页表中的R位被置位。

17. TLB需要的相联存储设备如何用硬件实现,这种设计对扩展性意味着什么?

答:相联存储器本质上将键与多个寄存器的内容同时进行比较。对于每个寄存器,必须有一组比较器,将寄存器内容中的每个位与正在搜索的键进行比较。实现这种设备所需的门(或晶体管)的数量是寄存器数量的线性函数,因此这种设计对扩展性意味着成本变得昂贵。

18.一台机器有48位虚拟地址和32位物理地址,页面大小是8KB,试问页表中需要多少个表项?

答:表项数为 2^48/2^13 = 2^35个。

19.一个计算机的页面大小为8KB,内存大小为256KB,虚拟地址空间为64GB,使用倒排页表实现虚拟内存。为了保证平均散列链的长度小于1,散列表应该多大?假设散列表的大小为2的幂。

答:内存有2^28(256KB) / 2^13(8KB) =(2^15)32768页。32K的哈希表的平均链长为1。为了使之小于1,必须使用下一个尺寸(2^16)65536项。将32768项放入65536格中使其平均链长为0.5,以保证快速的查询。

20.一个学生在编译器设计课程中向教授提议了一个项目:编写一个编译器,用来产生页面访问列表,该列表可以用于实现最优页面置换算法。试问这是否可能?为什么?有什么方法可以改进运行时的分页效率?

答:这是不可能的,除了程序的执行过程在编译时是完全可预测的少数情况。如果编译器收集程序有关调用代码中的位置信息,则可以在链接时使用此信息来重新排列目标代码,以便程序位于它们调用的代码附近。这将使得进程更可能与所调用的代码在同一个页面上。当然这从许多地方进行调用的程序来说是无效的。

21.假设虚拟页码索引流中有一些长的页码索引序列的重复,序列之后有时会是一个随机的页码索引。例如,序列0,1,…,511,431,0,1,…,511,332, 0,1,…中就包含了0,1,…,511的重复,以及跟随在它们之后的随机页码索引431和332。

       a)在工作负载比该序列短的情况下,标准的页面置换算法(LRU,FIFO,Clock) 在处理换页时为什么效果不好?

       b)如果一个程序分配了500个页框,请描述一个效果优于LRU、FIFO或Clock算法的页面置换方法

答:

a)标准的页面置换算法是针对已经在内存中的页面研究的。当工作负载比序列短时,会出现内存容量不够而长生颠簸,这种情况下LRU、Clock、FIFO算法达不到预期的效果。

b)如果分配了500个页框,那么0~498号页框是固定的,只有一个页框进行页面置换。

22.如果将FIFO页面罝换算法用到4个页框和8个页面上,若初始时页框为空,访问字符串为0172327103,请问会发生多少次缺页中断?如果使用LRU算法呢?

答:

FIFO的页框如下:

x0172333300

xx017222233

xxx01777722

xxxx0111177

LRU的页框如下:

x0172327103

xx017232710

xxx01773271

xxxx0111327

FIFO发生6次缺页中断,LRU发生7次缺页中断。

23.考虑图3- 15b中的页面序列。假设从页面B到页面A的R位分别是11011011。 使用第二次机会算法,被移走的是哪个页面?


答:将选择R位为0第一页,在这种情况下为D。

24.一台小计算机有4个页框。在第一个时钟滴答时R位是0111(页面0是0,其他页面是1),在随后的时钟滴答中这个值是1011、1010、1101、0010、1010、 1100、0001。如果使用带有8位计数器的老化算法,给出最后一个滴答后4个计数器的值。

答:计数器的值是:

第0页:0110110

第1页:01001001

第2页:00110111

第3页:10001011

25.请给出一个页面访问序列,其第一个被选择置换的页面必须不同于Clock和LRU 算法。假设一个进程分配了3个页框,访问串中的页号属于集合0,1,2,3。

答:顺序:0,1,2,1,2,0,3。在LRU中,第1页将替换为第3页。在Clock中,0将被替换,因为所有页面都将被标记,表针位于第0页。

26.在图3-21c的工作集时钟算法中,表针指向那个R = 0的页面。如果τ=400,这个页面将被移出吗?如果τ= 1000呢?


答:该页面的生存时间是2204 - 1213 = 991。如果τ= 400,它就不在工作集中,最近没有被引用,所以它将被移出。τ= 1000的情况不同,此时页面在工作集中,所以它不会被删除。

27.把一个64KB的程序从平均寻道时间10ms、旋转延迟时间10ms、 每磁道32KB的磁盘上装入,对于下列页面大小分别需要多少时间?

       a)页面大小为2KB;

       b)页面大小为4KB。

       假设页面随机地分布在磁盘上,柱面的数目非常大以至于两个页面在同一个柱面的机会可以忽略不计。

答:寻道加旋转延迟时间为20毫秒。对于2 KB的页面,加载32个页面将需要640毫秒。对于4 KB页面,加载16个页面需要320毫秒。

28.一个计算机有4个页框,装入时间、上次访问时间和每个页的R位和M位如 下所示(时间以时钟滴答为单位):

页面

装入时间

上次访问时间

R

M

0

126

280

1

0

1

230

265

0

1

2

140

270

0

0

3

110

285

1

1

       a)NRU算法将置换哪个页面?

       b)FIFO算法将置换哪个页面?

       c)LRU算法将置换哪个页面?

       d)第二次机会算法将置换哪个页面?

答:

NRU算法:2

FIFO算法:3

LRU算法:1

第二次机会算法:2

29.有二维数组:

       intX[64][64];

       假设系统中有4个页框,每个页框大小为128个字(一个整数占用一个字)。处理数组X的程序正好可以放在一页中,而且总是占用0号页。数据会在其他3个页框中被换入或换出。数组X为按行存储(即,在内存中,X[0][0]之后是X[0][1])。下面两段代码中,哪一个会有最少的缺页中断?请解释原因,并计算缺页中断的总数。

A段:

       for(int j = 0;j < 64;j++)

              for(int i = 0; i < 64; i++) X[i[[j] = 0;

B段:

       for(int i = 0; i < 64; i++)

              for(int j = 0; j < 64; j++) X[i][[j] = 0;

答:依题,A段按列访问,B段按行访问。X数组按行存储,即每一页可存储2行(128字节);每访问一次页框就发生一次缺页中断。A段:每访问2个数就发生一次缺页中断,则会有64*64/2 = 2048次缺页中断;B段:每访问2行就有一次缺页中断,因此只需要64/2 = 32次缺页中断。

30.PDP-I是最早的分时计算机之一,有4K个18位字的内存,在每个时刻它在内存中保持一个进程。当调度程序决定运行另一个进程时,将内存中的进程写到一个换页磁鼓上,磁鼓的表面有4K个18位字。磁鼓可以从任何字开始读写,而不仅仅是字0。请解释为什么要选这个磁鼓?

答:PDP-1磁鼓的优点是没有旋转延迟。每次记忆被写入鼓时,这节省了一半的旋转延迟。

31.一台计算机为每个进程提供65536字节的地址空间,这个地址空间被划分为4096字节的页面。一个特定的程序有32768字节的正文、16386字节的数据和15870字节的堆栈。这个程序能装入这个地址空间吗?如果页面大小是512字节,能放得下吗?记住一个页面不能同时包含两个不同段的成分。

答:

可用页面数:65536/4096=16

正文需要页面数:32768/4096=8

数据需要页面数:16386/4096=4.0005(取5)

堆栈需要页面数:15870/4096=3.87(取4)

总需要页面数:8+5+4=17>16,故不能装入这个地址空间。

如果页面大小是512字节,可用页面数:65535/512=128

正文需要页面数:32768/512=64

数据需要页面数:16386/512=32.004(取33)

堆栈需要页面数:15870/512=30.996(取31)

总需要页面数:64+33+31=128,故能装入这个地址空间。

32.一个页面同一时刻可能在两个工作集中吗?请解释原因。

答:如果页面可以共享,则可以。例如,如果分时系统的两个用户同时运行相同的编辑器,并且程序文本被共享而不是复制,那一些页面可能同时在每个用户的工作集中。

33.人们已经观察到在两次缺页中断之间执行的指令数与分配给程序的页框数直接成比例。如果可用内存加倍,缺页中断间的平均间隔也加倍。假设一条普通指令需要1μm,但是如果发生了缺页中断,就需要2001μs (即2ms处理缺页中断),如果一个程序运行了60s,期间发生了15000次缺页中断,如果可用内存是原来的两倍,那么这个程序运行需要多少时间?

答:该程序发生了15000次缺页中断,每个缺页中断都需要2ms的额外处理时间。处理缺页中断的总开销为30s。这意味着在程序运行的60s内,一半用于缺页中断开销,一半用于运行程序。如果我们运行程序的内存是内存的两倍,我们会得到一半的内存页错误,只有15秒的页面错误开销,所以总的运行时间将是45秒。

34.Frugal计算机公司的一组操作系统设计人员正在考虑在他们的新操作系统中减少对后备存储数量的需求。老板建议根本不要把程序正文保存在交换区中,而是在需要的时候直接从二进制文件中调页进来。在什么条件下(如果有这样的条件话)这种想法适用于程序文本?在什么条件下(如果有这样的条件话)这种想法适用于数据?

答:这种想法适用于无法修改的程序和不能被修改的数据。但是,通常程序不能修改,数据却极少数无法修改。如果二进制文件中的数据区被更新的页面覆盖,下一次程序启动时,它将不会有原始数据。

35.有一条机器语言指令将要被调入,该指令可把一个32位字装入含有32位字地址的寄存器。这个指令可能引起的最大缺页中断次数是多少?

答:该指令可能跨越页面边界,为了获取指令将导致两个缺页中断。获取的字也可能跨越页边界,产生两个以上的缺页中断,总共四个。如果字必须在内存中对齐,则数据字只能导致一个缺页中断,但是在某些机器(包括奔腾)上,在具有4 KB页面的机器上的4094地址上加载32位字的指令是合法的。

36.像在MULT1CS中那样,当同时使用分段和分页时,首先必须查找段描述符,然后是页描述符。TLB也是这样按两级查找的方式工作的吗?

答:否。搜索键使用段号和虚拟页码,因此可以在单个匹配中找到确切的页面。

37.一个程序中有两个段,段0中为指令,段1中为读/写数据。段0有读/执行保护,段1有读/写保护。内存是请求分页式虚拟内存系统,它的虚拟地址为4位页号,10位偏移量。页表和保护如下所示(表中的数字均为十进制):

段0

段1

读/执行

读/写

虚拟页号

页框号

虚拟页号

页框号

0

2

0

在磁盘

1

在磁盘

1

14

2

11

2

9

3

5

3

6

4

在磁盘

4

在磁盘

5

在磁盘

5

13

6

4

6

8

7

3

7

12

对于下面的每种情形,或者给出动态地址所对应的实(实际)内存地址,或者指出发生了哪种失效(缺页中断,或保护错误)。

       a)读取页:段1,页1,偏移3;

       b)存储页:段0,页0,偏移16;

       c)读取页:段1,页4,偏移28;

       d)跳转到:段1,页3,偏移32。

答:

a)读取,段1,符合保护要求,内存地址为(14,3); 

b)存储,段0,违反保护要求,保护错误; 

c)读取,段1,符合保护要求,页框在磁盘,发生缺页中断; 

d)跳转,段1,违反保护要求,保护错误。

38.你能想象在哪些情况下支持虚拟内存是个坏想法吗?不支持虚拟内存能得到什么好处呢?请解释。

答:一般来说,当可以了解和控制所有应用程序的需求时,虚拟内存就没必要了。例如,特殊用途的处理器(如网络处理器),嵌入式处理器和超级计算机(如机翼设计)。在这些情况下,我们总会考虑使用更多的物理内存。如果操作系统没有使用(不支持)虚拟内存,它的代码会简单很多,系统的性能会有所提高。另一方面,一些来自虚拟内存的想法有利于开发,尽管有不同的设计需求。

39.构造一个柱状图,计算你的计算机中可执行二进制文件大小的平均值和中间值。在Windows系统中,观察所有的.exe和.dll文件;在UNIX系统中,观察/bin、/usr/bin、/local/bin目录下的所有非脚本文件的可执行文件(或者使用file工具来查找所有的可执行文件)。确定这台机器的最优页面大小,只考虑代码(不包括数据)。考虑内部碎片和页表大小,对页表项的大小做出合理的假设。假设所有的程序被执行的可能性相同,所以可以同等对待。

答:略。

40.MS-DOS中的小程序可以编译成.COM文件。这些文件总是装载到0x100地址的一个内存段,这个内存段用作代码、数据和堆栈。转移执行的控制指令(如JMP、CALL) 和访问静态数据的指令把地址编译进目标代码中。写一个程序重定向这个程序文件,使之可以在任意开始地址处运行。读者的程序必须扫描代码,寻找指向固定内存地址的目标代码,然后在重定向范围内修改那些指向内存单元的地址。可以在汇编语言程序正文中找到这些目标地址。注意,要想不借助于额外的信息就出色完成这项工作通常是不可能的,因为有些数据字的值和指令目标代码相仿。

答:略。

41.编写一个程序,它使用老化算法模拟一个分页系统。页框的数量是参数。页面访问序列从文件中读取。对干一个给定的输入文件,列出每1000个内存访问中发生缺页中断的数目,它是可用页框数的函数。

答:略。

42.编写一个程序,说明TLB失效对有效内存存取时间的影响,内存存取时间可以用计算每次遍历大数组时的读取时间来衡量。

       a)解释编程思想,并描述所期望输出如何展示一些实际的虚拟内存体系结构。

       b)运行该程序,并解释运行结果与你的预期有何出人。

       c)在一台更古老的且有着不同体系结构的计算机上重复b),并解释输出上的区別。

答:略。

43.编写一个程序,该程序能说明当有两个进程的简单情况下,使用局部页置换策略和全局页置换策略的差异。读者将会用到能生成一个基于统计模型的页面访问串的例程。这个模型有N个状态,从0到N-1,代表每个可能的页面访问,每个状态i相关的概率pi代表下一次访问仍指向同一页面的几率。否则,下一次页面访问将以等概率指向其他任何一个页面。

       a)说明当N比较小时,页面访问串生成例程能运行正常。

       b)对有一个进程和固定数量的页框的情况计算缺页中断率。解释这种结果为什么是正确的。

       c)对有独立页面访问序列的两个进程,以及是b)中页框数两倍的页框,重复 b)。

       d)用全局策略替换局部策略重复c)。类似地,使用局部策略方法,比较每个进程缺页中断率。

答:略。

猜你喜欢

转载自blog.csdn.net/cztqwan/article/details/70598821