Max472 发表于 2021-9-7 21:46:59

操作系统选择题

有一个矩阵为100行×200列,即a。在一个虚拟系统中,采用LRU算法。系统分给该进程5个页面来存储数据(不包含程序),设每页可存放200个整数,该程序要对整个数组初始化,数组存储时是按行存放的。试计算下列两个程序各自的缺页次数(假定所有页都以请求方式调入)______。

程序一:for(i=0;i<=99;i++)
for(j=0;j<=199;j++)
A=i*j;

程序二:for(i=0;j<=199;j++)
for(i=0;i<=99;i++)
A=i*j;

A.100,200
B.100,20000
C.200,100
D.20000,100
答案:B

来个大神讲讲好吗?

人造人 发表于 2021-9-7 21:47:00

本帖最后由 人造人 于 2021-9-7 23:50 编辑

先看这个数组 a 在内存中的布局
这个数组中的每一个元素都有一个唯一的地址
a 的地址是 0
a 的地址是 1
a 的地址是 2
...
a 的地址是 197
a 的地址是 198
a 的地址是 199
...
a 的地址是 200
a 的地址是 201
a 的地址是 202
...
a 的地址是 397
a 的地址是 398
a 的地址是 399
...
a 的地址是 400
a 的地址是 401
a 的地址是 402
...
a 的地址是 597
a 的地址是 598
a 的地址是 599
...
a 的地址是 19400
a 的地址是 19401
a 的地址是 19402
...
a 的地址是 19597
a 的地址是 19598
a 的地址是 19599
...
a 的地址是 19600
a 的地址是 19601
a 的地址是 19602
...
a 的地址是 19797
a 的地址是 19798
a 的地址是 19799
...
a 的地址是 19800
a 的地址是 19801
a 的地址是 19802
...
a 的地址是 19997
a 的地址是 19998
a 的地址是 19999

就是先存放 a ~ a,然后存放 a ~ a,然后是 a ~ a,。。。
有一个公式可以计算出某一个元素的地址
a 的地址是 x * 200 + y
例如 a 的地址是 98 * 200 + 2 = 19602

按照题意,一页可以储存 200 个数
就是 a ~ a


程序1 是这样访问数组的
a, a, a, ..., a, a, a,
a, a, a, ..., a, a, a,
a, a, a, ..., a, a, a,
...
就是先访问 a ~ a,然后访问 a ~ a,然后是 a ~ a, ...

在访问 a 的时候,数据不存在,发生 1 次缺页,系统把 a ~ a 这 200 个数调入内存
之后访问 a, a, a, ..., a, a, a, 到目前为止一切正常
当访问 a 的时候,数据不存在, 又一次缺页,系统把 a ~ a 这 200 个数调入内存
访问 a ~ a 一次缺页
这样一共是 100 次缺页
访问 a 1 次
访问 a 1 次
访问 a 1 次
。。。
访问 a 1 次
访问 a 1 次
访问 a 1 次
一共 100 次




程序2
访问 a 一次缺页
然后访问的不是 a
访问的是 a,现在在内存中的是 a ~ a
a 不在内存中,又一次缺页,系统调入 a ~ a
然后访问的是 a, 又一次缺页
系统调入 a ~ a
其实每一次缺页异常后,只用到了一个数
然后是 a 异常
然后是 a 异常
。。。
然后是 a 异常
然后是 a 异常
然后是 a 异常
然后是 a 这里还是异常,因为上一次载入内存的是 a ~ a
这一次用的是 a,这个数据在 a ~ a 这一页上
第一次缺页异常的确载入了 a ~ a,但是系统只有 5 个页,a ~ a 这一页的内容早就被之前的操作覆盖了
就是程序2 访问一个数就会发生一次缺页异常
程序2 访问了 100 * 200 = 20000 次内存,发生了 20000 次异常

Max472 发表于 2021-9-8 00:00:12

人造人 发表于 2021-9-7 23:43




在访问 a 的时候,数据不存在,发生 1 次缺页,系统把 a ~ a 这 200 个数调入内存

之前看的都是一个数代表一页,比如,第一页,第二页,...
这题是 200 个数代表一页,我之前的想法是一页 200 个数需要调 200 次才能全部调入{:10_277:}
但现在是 200 个数都是一页,调入此页就是调入了 200 个数

谢谢
页: [1]
查看完整版本: 操作系统选择题