1、 OS习题课部分答案 存储管理 2、某系统采用请求分页式管理,页面淘汰算法为LRU,每个作业占15页,其中一页用来存放程序,每一页存放200个整型变量,考虑如下程序: int a[20][100],b[20][100],i,j; for(i=1;i<=20;i++) for(j=1;j<=100;j++) a[i][j]=0; for
2、i=1;i<=20;i++) for(j=1;j<=100;j++) b[i][j]=a[i][j]; 设数组ab均按行存储,程序已经调入主存,变量ij放在程序页中,问此程序会产生多少次缺页中断?最后留在内存中有哪些页面? 解: 数组a,2000个元素,共需占用10个页面,每两行一页 数组b,2000个元素,共需占用10个页面,每两行一页 第一个循环,a[I,j]=0会将a矩阵全部调入内存被赋值0,发生10次缺页中断,还剩4块; 第二个循环,先读a,再写b,剩余的空闲4块内存,可放入b数组的0~7行,此时内存已满,若用A1表示a数组的a[0]和a[1]行占据的页面编号,则a数
3、组的A0~A19和b数组的B0~B3页面(b[0]~b[7]行)均被读入内存, 即b[i][j]=a[i][j];的循环中从b[8]行开始要进行LRU淘汰,根据该循环特点,b[8]行=a[8]行 与b[9]行=a[9]行这两次循环的页面访问是A4B4A4B4,整个循环序列为: A4B4A4B4,A5B5A5B5,…A13B13A13B13,可化简为A4B4,A5B5,…A13B13 A4 B4 A5 B5 A6 B6 A7 B7 A8 B8 A9 B9 A10 B10 A11 B11 A12 B1
4、2 A13 B13 A0 B4 B11 1 B5 B12 2 B6 B13 3 B7
5、 4 A4 A11 5 A5 A12 6 A6 A13 7 A7
6、 8 A8 9 B8 b0 A9 b1 B9
7、 b2 A10 b3 B10 14次缺页中断 + + + + + + + + + + + + + + + 总共发生14+15=29次缺页中断,内存中最终页面A7-A13,B7-B13 3. 考虑以下程序: int a[100][150],b[150][200],c[100][200],i,j,k; For
8、i=1;i<=100;i++) for(j=1;j<=200;j++) for(k=1;k<=150;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; 设a、b矩阵已经置好初值,c矩阵初始为0,各矩阵以页为单位连续存放;主存初始为空,请求分页时采用fifo算法。 问:当作业分配10个页面,每个页面可存储100整数,缺页次数是多少?留在内存的最后的页面abc矩阵各占多少页? 解: 矩阵a[100][150] 共需150页 每行占1.5个页面 矩阵b[150][200] 共需300页 每行占2个页面 矩阵c[100][200] 共需
9、200页 每行占2个页面 程序的逻辑地址空间中,总共需要650个页面,试编号为: a占用1-150号页面;b占151-450号;c占451-650号. c[i][j]=c[i][j]+a[i][k]*b[k][j]è读a,读b,计算a*b,读c,计算c+a*b,写c;而与内存访问有关的操作可简化为:读a,读b,读c,写c 对于依次访问的a,b,c矩阵,只要不跨页,不会发生缺页中断;比如每次访问a[I,k]和c[I,j]时;但是,在每次访问b[k][j]的时候,由于是按列读取,必然跨页。采用fifo算法,页面调度过程如下: 循环变量 读写操作 内存页面 i,j,k 1
10、2 3 4 5 6 7 8 9 10 缺页 1,1,1 读a 1 缺 读b 1 151 缺 读c写c 1 151 451 缺 1,1,2 读a 1 151 451 读b 1 151 451 153 缺 读c写c 1 151 451 153 1,1,3 读a 1 151 451 153
11、 读b 1 151 451 153 155 缺 读c写c 1 151 451 153 155 ………每次循环发生1次缺页,且都是为读b而生,从151-165都被载入内存 1,1,8 读a 1 151 451 153 155 157 159 161 163 读b 1 151 451 153 155 157 159 161 163 165 缺 读c写c 1 151 451 153 155 157 159 161 163 165此时内存全满
12、 1,1,9 读a 1 151 451 153 155 157 159 161 163 165 读b 167 151 451 153 155 157 159 161 163 165 缺 读c写c 167 151 451 153 155 157 159 161 163 165 1,1,10 读a 167 1 451 153 155 157 159 161 163 165 缺 读b 167 1 169 153 155 157 159 161 163 165
13、 缺 读c写c 167 1 169 451 155 157 159 161 163 165 缺 1,1,11 读a 167 1 169 451 155 157 159 161 163 165 读b 167 1 169 451 171 157 159 161 163 165 缺 读c写c 167 1 169 451 171 157 159 161 163 165 ………每次循环发生1次缺页 1,1,100 读a 1 331 333 335 337 339 341
14、 343 345 347 缺 读b 1 349 333 335 337 339 341 343 345 347 缺 读c写c 1 349 451 335 337 339 341 343 345 347 缺 1,1,101 读a 1 349 451 2a矩阵跨页了 337 339 341 343 345 347 缺 读b 1 349 451 2 351 339 341 343 345 347 缺 读c写c 1 349 451 2 351 452c矩阵也跨页了
15、 341 343 345 347 缺 ……… 100,200,148 读a 150 428 430 432 434 436 438 440 442 444 缺 读b 150 446 430 432 434 436 438 440 442 444 缺 读c写c 150 446 650 432 434 436 438 440 442 444 缺 100,200,149 读a 150 446 650 432 434 436 438 440 442 444 读b 150
16、 446 650 448 434 436 438 440 442 444 缺 读c写c 150 446 650 448 434 436 438 440 442 444 100,200,150 读a 150 446 650 448 434 436 438 440 442 444 读b 150 446 650 448 450 436 438 440 442 444 缺 读c写c 150 446 650 448 450 436 438 440 442 444 规律
17、当循环次数为n*9+1或n*100+1时,读a,b,c都会发生缺页;其他情况,只有读b时发生1次缺页; 所以,读b总共发生缺页次数:100*200*150次,而对于b和c来说: 总共100*200*150=3000000次循环中,n*9+1出现次数为:3000000/9=333333次 而n*100+1出现的次数为:3000000/100=29999次; 而n*9+1与n*100+1均出现的次数为3000000/900=3333次,此次数有重复计数,需减去,所以总缺页次数为: (100*200*150)+(333333+29999-3333)*2次,即3719998次缺页中断。
18、 4、有一个虚拟存储系统采用LRU算法,每个程序占3页内存,其中一页存放程序和变量i,j(不做他用)。每一页可存放150个变量,程序A和B如下: A: int c[150][100],i,j; for(i=0;i<=150;i++) for(j=1;j<=100;j++) c[i][j]=0; B: int c[150][100]; for(j=1;j<=100;j++) for(i=1;i<=150;i++) c[i][j]=0; 数组C按行存储,试问: (1)程序A和B执行完后,分别缺页多少次? (2)最后留在
19、内存中的各是C的哪一部分? 解: (1)数组C共需占100页,因为按行存储,所以每读入一个页面,会读入c数组的1.5行,如下所示: 页面1 页面2 c[1][1]………….. c[2][51]............... …………c[1][100] ...............c[2][150] c[2][1]………….. c[3][1].................. …………c[2][50] ...............c[3][50] 对于程序A,c按行访问,每循环
20、150次发生1次缺页中断,故总共发生100次缺页中断。 对于程序B,c按列访问,每循环3次就要发生2次调页,c[1][1],c[2][1],c[3][1]…..共发生2*15000/3=10000次缺页。 (2)对于程序A,后300次循环访问的c数组元素,是保存在最后两个页面中的元素 对于程序B,后3次循环访问的c数组元素,是保存在最后两个页面的元素。 1、 在南开大学与天津大学之间有一条小路,其中从S到T每次只允许一辆自行车通过,但中间有一个小的安全岛M(同时允许两辆自行车停留),可供两辆自行车在已从两端进入小路情况下错车使用,如下图所示。试用PV操作设计一个算法使得来往的自






