1. IBM 360 有一个设计,为了对 2KB 大小的块进行加锁,会对每个块分配一个 4bit 的秘钥,这个秘钥会存在 PSW 中,每次内存引用时,CPU都会进行秘钥比较。但该设计有诸多缺陷,除了描述中所言,请另外提出两条缺点。
- 每个块都需要额外的存储单元,用于存放保秘钥的值。
- 比对秘钥会浪费算力。
- 4bit 的秘钥决定了最多只能有16个进程同时运行。
2.在图 3-3 中基址寄存器和界限寄存器含有相同的值 16384,这是巧合还是它们总是相等?如果这是巧合,为什么这个例子里它们是相等的?
显然是巧合。基址寄存器用于存储程序的起始物理地址位置,界限寄存器用于存储程序的长度。
之所以相等是因为:
- 示例中给出的程序长度都是 16K,因此界限寄存器必然是 16K。
- 图中描绘的基址寄存器恰好是第二个程序的起始位置,因此恰好是 0 + 16K。
3.交换系统通过紧缩来消除空闲区。假设有很多空闲区和数据段随机分布,并且读或写32位长的字需要4ns的时间,紧缩4GB的空间大概需要多长时间?为了简单期间,假设字节 0 在空闲区中,内存中最高地址处含有有效数据。
需要拷贝 4GB 数据,读写串行:
4
G
B
r
e
a
d
_
s
p
e
e
d
+
4
G
B
w
r
i
t
e
_
s
p
e
e
d
≈
8.59
秒
\frac{4GB}{read\_speed} + \frac{4GB}{write\_speed} ≈ 8.59 秒
read_speed4GB+write_speed4GB≈8.59秒
4. 在一个交换系统中,按内存地址排列的空闲区大小是 10MB,4MB,20MB,18MB,7MB,9MB,12MB,15MB。对于连续的段请求:(a) 12MB,(b) 10MB,(c) 9MB。使用首次适配,最佳适配,最差适配,下次适配分别会找出哪个空闲区。
首次适配 | 最差适配 | 最佳适配 | 下次适配 | |
---|---|---|---|---|
(a) 12MB | 20MB | 20MB | 12MB | 20MB |
(b) 10MB | 10MB | 18MB | 10MB | 18MB |
(c) 9MB | 18MB | 15MB | 9MB | 9MB |
这题的数据给的很巧妙,保证 a,b,c 三段内存不会分配到同一个空闲区。
5. 物理地址和虚拟地址有什么区别。
- 物理地址是真实的地址,每个地址都对应了内存上一个字节的存储单元。
- 虚拟地址是逻辑地址,它和存储单元的关系会发生改变。
- 物理地址的上限取决于硬件,比如内存条的大小。而虚拟地址并不受限于此。
6.对下面的每个十进制虚拟地址,分别使用 4KB 和 8KB 的页面计算虚拟页号和偏移量。
p a g e N u m b e r = ⌊ v i r t u a l A d d r e s s p a g e S i z e ⌋ pageNumber = \lfloor\frac{virtualAddress}{pageSize}\rfloor pageNumber=⌊pageSizevirtualAddress⌋
o f f s e t = v i r t u a l A d d r e s s % p a g e S i z e offset = virtualAddress\ \%\ pageSize offset=virtualAddress % pageSize
页面大小为 4KB 时,
虚拟地址 20000, 页号 4,偏移量 3616
虚拟地址 32768,页号 8,偏移量 0
虚拟地址 60000,页号 14,偏移量 2656
页面大小为 8KB 时,
虚拟地址 20000, 页号 2,偏移量 3616
虚拟地址 32768,页号 4,偏移量 0
虚拟地址 60000,页号 7,偏移量 2656
7. 使用图 3-9 的页表,给出下面每个虚拟地址对应的物理地址。
计算方法:虚拟地址减去所在页面的起始地址加上对应页框的起始地址。
虚拟地址 20,物理地址4116。
虚拟地址 4100,物理地址 4100。
虚拟地址8300,物理地址 24684。
8. Intel 8086 处理器没有 MMU,也不支持虚拟内存,然而一些公司曾经出售过这种操作系统:包含未做任何改动的8086CPU,支持分页。猜想一下,他们是如何做到这一点的。
They built an MMU and inserted it between the 8086 and the bus. Thus all 8086 physical addresses went into the MMU as virtual addresses. The MMU then mapped them onto physical addresses, which went to the bus.
9. 为了支持分页虚拟内存工作,需要怎样的硬件支持?
There needs to be an MMU that can remap virtual pages to physical pages. Also, when a page not currently mapped is referenced, there needs to be a trap to the operating system so it can fetch the page.
10. 写时复制是使用在服务器系统上的好方法,它能否使用在手机上呢?
If the smartphone supports multiprogramming, which the iPhone, Android, and Windows phones all do, then multiple processes are supported. If a process forks and pages are shared between parent and child, copy on write definitely makes sense. A smartphone is smaller than a server, but logically it is not so different.
11. 考虑下面的 C 程序并回答问题。
int X[N];
int step = M;
for (int i = 0; i < N; i += step)
X[i] = X[i]+1;
a. 如果这个程序运行在一个页面大小为 4KB且有64个TLB表项的机器上,那么 M 和 N 取什么值会使得内存循环的每次执行都会引起TLB失效?
TLB(Translation Lookaside Table) 用于将虚拟地址直接映射到物理地址,而无需访问页表。
64个 TLB 表项最多存储 64 个页面和页框的映射关系。
当要访问的页面不在 TLB 内时,即导致一次 TLB 失效。
为了导致TLB失效,则上述程序必须占用 65 个页面:
- 1 个页面存储代码段。
- 至少 64 个页面存储数据段。
则 N 不能小于 64 ∗ 4 K B s i z e o f ( i n t ) = 64 ∗ 102 4 3 \frac{64*4KB}{sizeof(int)} = 64*1024^3 sizeof(int)64∗4KB=64∗10243。
又因为每次执行循环体都要触发 TLB 失效,则没相邻的两次访问都不能在一个页面内,即 N 不能小于 4 K B s i z e o f ( i n t ) = 1024 \frac{4KB}{sizeof(int)} = 1024 sizeof(int)4KB=1024。
b. 如果循环重复很多遍,结果会和a的答案相同吗?请解释。
相同。只要能保证TLB放不下所有的页面且每次访问的页面均不在TLB内即可。
12. 可用于存储页面的有效磁盘空间的大小和下列因素有关:最多进程数 n,虚拟地址空间的字节数 v,RAM 的字节数 r。给出最坏情况下磁盘空间需求的表达式。这个数量的真实性如何?
The total virtual address space for all the processes combined is nv, so this much storage is needed for pages. However, an amount r can be in RAM, so the amount of disk storage required is only nv − r. This amount is far more than is ever needed in practice because rarely will there be n processes actually running and even more rarely will all of them need the maximum allowed virtual memory.
13. 如果一条指令执行 1ns,缺页中断执行额外的 Nns,且每 k 条指令产生一个缺页,请给出一个公式,计算有效指令时间。
有效指令时间应该就是指令执行的平均时间: k + N k = 1 + N k n s \frac{k+N}{k} = 1+\frac{N}{k} ns kk+N=1+kNns。
14. 一个机器有 32 位地址空间和 8KB页面,页表全在硬件中,页面的每一表项为一个 32 位字。进程启动时,以每个字100ns的速度将页表从内存复制到硬件中。如果每个进程运行 100ms,用来装入页表的CPU时间的比例是多少?
首先计算页表项的数量:
2
32
8
K
=
2
19
个页表项
\frac{2^{32}}{8K} = 2^{19}个页表项
8K232=219个页表项
将这些页表项全部加载至硬件的时间为:
2
19
∗
100
/
1000
/
1000
m
s
=
52.43
m
s
2^{19}*100 / 1000 / 1000 ms = 52.43 ms
219∗100/1000/1000ms=52.43ms
则比例为 52.43%。
15. 假设一个机器有 48 位的虚拟地址和32位的物理地址,请回答以下问题。
a. 假设页面大小是 4KB,如果只有一级页表,那么有多少页表项?请解释。
一级页表的页表项数量取决于虚拟地址空间和页表。共有 2 48 4 K = 2 36 \frac{2^{48}}{4K} = 2^{36} 4K248=236 个页表项。
b. 假设同一系统有TLB,共 32 个表项。并且假设一个程序的指令正好能放入一个页,其功能是顺序的从数组中读取长整型元素,该数组存在上千个不同的页中。在这种情况下TLB的效果如何。
首先,存放指令的页面会一直在 TLB 中。
其次,每读
4
K
8
=
512
\frac{4K}{8} = 512
84K=512 个元素,就会发生一次缺页。
16. 给定如下数据,并回答相关问题。
a. TLB 有1024 项,可以在 1ns 内访问。
b. 页表项可以在 100ns 内访问。
c. 平均页面替换时间为 6ms。
如果TLB处理的页面访问占 99%,并且 0.01% 的页面访问互触发缺页中断,那么有效的转换时间为:
1 n s ∗ 0.99 + 100 n s ∗ 0.099 + 0.0001 ∗ 6 ∗ 1 0 6 n s ≈ 601.98 n s 1ns * 0.99 + 100ns * 0.099 + 0.0001*6*10^6ns ≈ 601.98ns 1ns∗0.99+100ns∗0.099+0.0001∗6∗106ns≈601.98ns
17. 假设一个机器有 38 位虚拟地址和 32 位物理地址。回答下列问题。
a.与一级页表相比,多级页表有什么优势?
- 可以解决巨大的虚拟地址问题。
- 可以避免创建不必要的表项。
b.若采用二级页表,页面大小为 16KB,每个页表项为 4 字节,应该对第一级页表域分配多少位?对第二级页表域分配多少位?
38 位虚拟地址,需用38个bit存储,采用二级页表时,这些bit会被分成三部分:
- Offset: 取决于页框的大小, l o g 2 16 K = 14 log_2\ {16K} = 14 log2 16K=14 位比特。
- 第二级页表域:取决于每个页框能放下的页表项的数量 16 K B 4 b y t e s = 4 K \frac{16KB}{4bytes} = 4K 4bytes16KB=4K。因此第二级页表域需要 l o g 2 4 K = 12 log_2\ {4K} = 12 log2 4K=12 位比特。
- 第一级页表域:需要 38 − 14 − 12 = 12 38 - 14 -12 = 12 38−14−12=12 位比特。
18. 在 3.3.4 节的陈述中,奔腾 Pro 将多级页表项中的每个页表项扩展到了 64 位,但仍只能对 4GB 的内存进行寻址?为什么?
虽然页表项提升到了 64位,但没有修改虚拟地址的长度,虚拟地址仍然由 32 位表达,仅仅是修改了位的分配方式,(PT1,PT2,Offset) 修改为 (PT1,PT2,PT3,Offset),即 (10,10,12) 修改为 (2,9,9,12)。
19. 一个 32 位地址的计算机使用两级页表。虚拟地址被划分为 9位的第一级页表域,11位的二级页表域和一个偏移量,页面大小是多少呢?在地址空间中一共有多少个界面?
总共 32 位,因此 O f f s e t = 32 − 9 − 11 = 12 Offset = 32 - 9 - 11 = 12 Offset=32−9−11=12 。
因此,页面大小为 2 O f f s e t = 2 12 = 4 K B 2^{Offset} = 2^{12} = 4KB 2Offset=212=4KB。
页面总数为
t
o
t
a
l
S
p
a
c
e
p
a
g
e
S
i
z
e
=
2
32
B
4
K
B
=
2
20
\frac{totalSpace}{pageSize} = \frac{2^{32}B}{4KB}=2^{20}
pageSizetotalSpace=4KB232B=220
20. 一个计算机使用 32 位的虚拟地址,4KB 大小的页面。程序和数据都位于最低的页面(0~4095),栈位于最高的页面。如果使用一级分页,总共有多少个页表项?如果二级分页,每部分 10 位,总共有多少页表项。
一级分页时,因为是按页表项的下标进行索引,所以每个页面的页表项都必须存在,共有:
t
o
t
a
l
S
p
a
c
e
p
a
g
e
S
i
z
e
=
2
32
B
4
K
B
=
2
20
个页面。
\frac{totalSpace}{pageSize} = \frac{2^{32}B}{4KB} = 2^{20} 个页面。
pageSizetotalSpace=4KB232B=220个页面。
二级分页时,总共有 1026 个页表项。
因为一级页表项是按下标进行索引,所以必须全部存在,因此共有
2
10
=
1024
2^{10} = 1024
210=1024 个页表项。
二级页面项只有被用到了才需要存在,因此共有两个:
- 其一是存储程序和数据的页面对应页表项。
- 其二是存储栈的页面对应的页表项。
21. 在页大小为 512 字节的计算机上,一个程序在 1020 地址,其栈指针在 8192,栈向 0 生长。请给出该程序产生的页面访问串。每个指令(包含立即常数)占四个字节。指令和数据的访问都要在访问串中。
程序片段的执行轨迹如下:
- 将字 6144 载入寄存器 0。
- 寄存器 0 压栈。
- 调用 5120 处的程序,将返回地址压栈。
- 栈指针减去立即数 16。
- 比较实参和立即数 4。
- 如果相等,跳转到 5152 处。
我理解这道题主要是观察程序计数器(PC) 和栈指针(esp)。
首先写出对应的伪汇编指令:
movl 6144, %0
pushl %0
call 5120
subl $16, %esp
cmpl $4, 20(%esp)
je 5152
步骤 | 执行操作 | 执行后的 esp | 执行后的PC | 解释 |
---|---|---|---|---|
初始时 | \ | 8192 | 1020 | 初始状态 |
movl 6144, %0 | 字 6144 载入寄存器 | 8192 | 1024 | 1.指令所在的内存页 (512-1023);2. 字6144所在页面(6144-6655) |
pushl %0 | 寄存器 0 入栈 | 8188 | 1028 | 访问了两个页面:1. 指令所在页面(1024-1535);2. 栈帧所在页面(7680-8191)。 |
call 5120 | 将返回地址压栈,然后修改PC 为 5120 | 8184 | 5120 | 1. 压栈指令所在页面(1024-1535);2.访问栈帧所在页面(7680-8191); |
subl $16, %esp | 栈指针减去立即数 16 | 8168 | 5124 | 访问指令所在页面(5120-5533) |
cmpl $4, 20(%esp) | 从 20(%esp) 处取得实参;比较实参和立即数 4 | 8168 | 5128 | 1. 指令所在界面(5120-5533);2. 实参所在页面(7680-8191) |
je 5152 | 如果相等,跳转到 5152 处 | 8168 | 5132 | 显然不相等,只需访问该条指令所在页面(5120-5533) |
22. 一台计算机的进程在其地址空间有 1024 个页面,页表保存在内存中。从页表中读取一个字的开销是 5ns。为了减小开销,该计算机使用了 TLB,它有 32 个(虚拟页面,物理页框)对,能在 1ns 内完成查找。请问把平均开销降到 2ns 需要的命中率是多少。
首先看命中的耗时,很简单,就是 1ns。
未命中的耗时包含两部分,共 6ns
- 查找 TLB,1ns
- 查找页表,5ns
那就变成了简单的一元一次方程,设命中率为 x,则有:
1 ∗ x + 5 ( 1 − x ) = 2 1 * x + 5 (1-x) = 2 1∗x+5(1−x)=2
解得, x = 75 x = 75% x=75
23. TLB 需要的相联内存设备如何用硬件实现?这种设计对扩展性意味着什么?
An associative memory essentially compares a key to the contents of multiple registers simultaneously. For each register there must be a set of comparators that compare each bit in the register contents to the key being searched for. The number of gates (or transistors) needed to implement such a device is a linear function of the number of registers, so expanding the design gets expensive linearly.
24. 一台机器有 48 位虚拟地址和 32 位物理地址,页面大小是 8KB,采用一级页表时会有多少表项?
采用一级页表时,页表项数量仅取决于虚拟地址空间大小和页面大小。
p a g e C o u n t = v i r t u a l S p a c e S i z e p a g e S i z e = 2 48 8 K = 2 35 个 pageCount = \frac{virtualSpaceSize}{pageSize} = \frac{2^{48}}{8K} = 2^{35} 个 pageCount=pageSizevirtualSpaceSize=8K248=235个
25. 一个计算机的页面大小是 8KB,主存大小是 256KB,64GB 虚拟地址空间使用倒排页表实现虚拟内存。为了保证平均散列链的长度小于 1,散列表应该多大?假设散列表的大小为 2 的幂。
倒排页表的表项数量取决于页面大小和主存大小。
p a g e C o u n t = m a i n M e m o r y S i z e p a g e S i z e = 256 K 8 K = 32 个。 pageCount = \frac{mainMemorySize}{pageSize} = \frac{256K}{8K} = 32 个。 pageCount=pageSizemainMemorySize=8K256K=32个。
散列链的平均长度为 a v g L e n = p a g e C o u n t h a s h T a b l e S i z e = 32 h a s h T a b l e S i z e avgLen = \frac{pageCount}{hashTableSize} = \frac{32}{hashTableSize} avgLen=hashTableSizepageCount=hashTableSize32
为使散列链平均长度小于 1,且hashTableSize 为 2 的幂,hashTableSize 应取 64。
26. 一个学生在编译器设计课程中向教授提议:编写一个编译器,用来产生页面访问列表,该列表可以用于实现最优页面置换算法。试问这是否可能?为什么?有什么方法可以改进运行时的页面置换率。
不可能。
程序访问页面的列表可能依赖于输入。
TLB。
更大的内存。
27. 假设虚拟页码索引流有一些重复的页索引序列,该序列之后有时会是一个随机的页码索引。例如,序列 0,1,2,3…,511,431,0,1,2,3…,511,332,0,1… 中就包含了 0,1,2,3…,511 的重复每一级跟随在它们之后的随机页码索引 431 和 322。
- 在工作负载比该序列短的情况下,标准的页面置换算法(LRU,FIFO,Clock) 在处理换页时为什么效果不好?
先说 FIFO,当页框数小于页面数时,先来的先淘汰。那么,对于题目中给出的序列,显然每一次访问都会缺页。
LRU的工作原理是基于「总是频繁的访问少量的页面」。像题目这种均匀的访问序列,LRU 显然会退化为 FIFO,也就是当页框数小于页面数时每次访问都会引起缺页。
Clock 类似,也是会退化为 FIFO。
- 如果一个程序分配了 500 个页框,如何设计更优的页面置换算法?
用 499 个页框缓存前 499 个页面。仅用最后一个页框做置换。
28. 现有 4 个页框,8 个页面,初始时页框为空,访问序列串为 0172327103。请问会 FIFO 和 LRU 会发生多少次缺页终端?
FIFO,六次缺页
访问序列 | 页框状态 | 是否缺页 |
---|---|---|
初始化 | ---- | N |
0 | 0— | Y |
1 | 01– | Y |
7 | 017- | Y |
2 | 0172 | Y |
3 | 1723 | Y |
2 | 1723 | N |
7 | 1723 | N |
1 | 1723 | N |
0 | 7230 | Y |
3 | 7230 | N |
LRU 七次缺页
访问序列 | 页框状态 | 是否缺页 |
---|---|---|
初始化 | ---- | N |
0 | 0— | Y |
1 | 01– | Y |
7 | 017- | Y |
2 | 0172 | Y |
3 | 1723 | Y |
2 | 1723 | N |
7 | 1723 | N |
1 | 1723 | N |
0 | 1720 | Y |
3 | 1730 | Y |
29. 考虑图 3-15 b 中的页面序列。假设从页面B到页面的A的R位分别是 11011011。使用第二次机会算法,被移走的是哪个页面?
第一个 R 位为0 的页面被移走,也就是 D。
30. 一台小计算机有 4 个页框。在第一个时钟周期时 R 位是 0111,在随后的时钟周期中这个值是 1011,1010,1101,0010,1010,1100,0001。如果使用带有 8 位计数器的老化算法,给出最后一个时钟周期后 4 个计数器的值。
就是将每一个时钟周期的R位组合,得出计数器的值。
page0:01110110
page1:10010010
page2:11101100
page3:11010001
31. 请给出一个页面访问序列,使得LRU和Clock算法得到的第一个被置换的页面不同。假设有3 个页框,4 个页面。
页面访问序列:
第一部分:012。把页框填满。结束时Clock算法的指针指向 0。
第二部分:0。调整页面 0 在 LRU 中的优先级。结束时Clock算法的指针指向 0。
第三部分:3。引起置换。
当进行到第三部分时,Clock 会把所有页面的R位置为0,然后置换页面 0。LRU 一定会置换页面 1。
32. 在图 3-20 c的工作集时钟算法中,表针指向那个R=0的页面。如果 t = 400,这个页面会被移除吗?如果 t=1000呢?
一个页面被移除有两种情况:
- 该页面R=0且生存时间大于 t。
- 所有R=0的页面的生存时间都不超过 t,但这个页面是最久的。
该页面的生存时间是 2204-1203=991。
当 t=400时,显然符合第一个条件。
当 t=1000 时,符合第二个条件。
33. 假如工作集时钟页面置换算法使用的 t 为两个时钟周期系统状态如下:
页 | timestamp | V | R | M |
---|---|---|---|---|
0 | 6 | 1 | 0 | 1 |
1 | 9 | 1 | 1 | 0 |
2 | 9 | 1 | 1 | 1 |
3 | 7 | 1 | 0 | 0 |
4 | 4 | 0 | 0 | 0 |
其中,V 代表有效位,R代表访问位,M代表修改位。
问题1:如果时钟中断发生在时钟周期10,请给出新的表项内容并给出解释。
在时钟中断时,不会淘汰页面,仅会修改时间戳,R,M:
- 观察 R:
- 如果 R = 1,则 R = 0,timestamp = 当前时间戳。
- 如果 R = 0,什么都不做。
- 观察 M:
- 如果 M = 0,什么都不做。
- 如果 M = 1。这个书中没说要如何处理(也可能是我看漏了),姑且认为是生命周期过长时回写吧。
页 | timestamp | V | R | M | |
---|---|---|---|---|---|
0 | 6 | 1 | 0 | 0 | |
1 | 10 | 1 | 0 | 0 | |
2 | 10 | 1 | 0 | 1 | |
3 | 7 | 1 | 0 | 0 | 无变化 |
4 | 4 | 0 | 0 | 0 | 无变化 |
问题2:假如没有时钟中断,在时钟周期10,因为向页4发出了一个读请求而发生了缺页中断。请给出新的页表项内容并解释。
在缺页中断时:
- 如果 R = 1,说明还在工作集,仅重置R。继续下一个页表项。
- 如果 R = 0:
- 生存时间超过 t
- 且是干净的,替换之。 算法结束。
- 不干净:回写,但不等待写结束。继续下一个页表项。
- 生成时间未超过 t:仍在工作集中,继续下一个页表项。
- 生存时间超过 t
- 特殊的,如果遍历一圈仍为找到合适的页表项。
- 所有页表都在工作集中(遍历过程中R=1或生存时间过短):寻找一个干净页面置换之。
- 有页面不在工作集中:必然有页面回写了,等待写结束置换之。
题目没说此时指针指向哪个页面,姑且认为是 0。
页 | 时间戳 | V | R | M |
---|---|---|---|---|
0 | 6 | 1 | 0 | 0 |
1 | 9 | 1 | 0 | 0 |
2 | 9 | 1 | 0 | 1 |
3 | 7 | 0 | 0 | 0 |
4 | 10 | 1 | 1 | 0 |
这里有个疑问:M 只有一个 bit,如何标记干净,脏,和回写未完成三种状态呢?还是说,中断程序必须等到所有回写操作完成呢?
34. 一个学生声称:“抽象来看,除了选取替代页面使用的属性不同外,基本页面置换算法(FIFO,LRU,最优算法)都相同。”
先来回忆下三种算法的大体定义:
- FIFO:最先载入内存的被置换。
- LRU:未使用时间最长的页面被置换。
- 最优算法:下一次使用时间最远的页面被置换。
问题一:FIFO,LRU,最优算法使用的属性是什么?
- FIFO:页面的载入时间。
- LRU:页面上一次的使用时间。
- 最优算法:页面的下一次使用时间。
问题二:请给出这些页面置换算法的通用算法?
- 最值:为每个页面添加一种属性,并寻找拥有最值的页面。
35. 从平均寻道时间 10ms,旋转延迟时间 10ms,每磁道 32KB的磁盘上载入一个64KB的程序。假设页面随机的分配在磁盘上,以至于两个页面在同一柱面的概率可以忽略不计。
假设一个页面存储在连续的扇区内,则读取一个页面的耗时为下述三者之和:
- 平均寻道时间 10ms。
- 旋转延迟时间 10ms。
- 数据传输时间。
但是这个题没给传输时间或者传输速率,怎么算呢?
36. 一个计算机有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 将置换 2 (RM 组成的数字最小,即最近未被使用且置换成本最低)
(b) FIFO 将置换 3 (载入时间最早)
(b) LRU 将置换1 (最近访问时间最远)
(d) 第二次置换算法将置换 2 (基于 FIFO 改造,优先置换R=0)
37. 假设有两个进程 A 和 B,共享一个不在内存中的页。如果进程 A 在共享页发生缺页,当该页读入内存时,A的页表项必须更新。
问题一:在什么条件下,即使进程A的缺页中断处理会将共享页装入内存,B的页表更新也会延迟?
The page table update should be delayed for process B if it will never access the shared page or if it accesses it when the page has been swapped out again. Unfortunately, in the general case, we do not know what process B will do in the future.
问题二:延迟页表更新会有什么潜在开销?
The cost is that this lazy page fault handling can incur more page faults. The overhead of each page fault plays an important role in determining if this strategy is more efficient. (Aside: This cost is similar to that faced by the copy-on-write strategy for supporting some UNIX fork system call implementations.)
38. 有二维数组:int X[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;
}
}
B 有较少的缺页中断。
B 段会连续访问在一页之内的数据。 i 每迭代两次,会造成一次缺页中断,共 32 次。
A 段会跳跃的访问数据。对于每一个 j,i 每迭代两次就会造成一次缺页。即 64 ∗ 64 2 = 2048 64*\frac{64}{2}=2048 64∗264=2048 次缺页。
39. 假如你被一家云计算公司雇佣,该公司在它的每个数据中心都部署了成千上万的服务器。公司最近听说了一个好方法:在服务器A上处理缺页中断时,是通过读取其他服务器的RAM中的页面,以代替从本地磁盘上读取页面。
问题一:如何实现?
适用于此种的方案的页面,必然是很基础的库,比如一些常用的共享库。
假设对于一些常用的共享库代码页面,会有 x% 的概率在内存中。那么当本地发生缺页中断时,想其他 n 台服务器发送读取请求,以保证有 1 − ( x 100 ) n 1-(\frac{x}{100})^n 1−(100x)n 的概率能成功。当失败时再从磁盘加载。
问题二:在什么条件下该方法是有价值的、有效的?
- 页面只读。
- 页面存在于其他服务器内存中的概率较高。
- 服务器之间的传输时间明显优于从本地磁盘加载。
40. DEC PDP-1 是最早的分时计算机之一,有 4K 个 18位字的内存。在每个时刻它在内存中保持一个进程。当调度程序决定运行另一个进程时,将内存中的进程写到一个换页磁鼓上,磁鼓的表面有 4K 个18位字。磁鼓可以从任何字开始读写,而不是仅仅在字 0。请解释为什么要选这样的磁鼓?
- 可从任意字开始读写:因为内存中的字可能有很多是干净的,在磁鼓上有对应的副本,因此可直接丢弃。为了避免不必要的换出,需要磁鼓支持可从不同的字开始读写。
- 磁鼓比磁盘更快,比如没有寻到或者旋转时间。
41. 一台计算机为每个进程提供 65536 字节的地址空间,这个地址空间被换分为多个 4KB 的页面,一个特定的程序有 32768 字节的正文,16386字节的数据和 15870 字节的堆栈。这个程序能装入这个机器的地址空间吗?如果页面大小是 512 字节,能放的下吗?记住一个页面不能同时包含两个或者更多的不同类型段,例如,一页里不能同时有代码段或者数据段。
当页面大小为 4KB 时,共有 16 个页面,但程序共需 17 个页面,显然不能放下。
- 正文需要 ⌊ 32768 4096 ⌋ = 8 \lfloor{\frac{32768}{4096}}\rfloor = 8 ⌊409632768⌋=8 个页面。
- 数据需要 ⌊ 16386 4096 ⌋ = 5 \lfloor{\frac{16386}{4096}}\rfloor = 5 ⌊409616386⌋=5 个页面。
- 堆栈需要 ⌊ 15870 4096 ⌋ = 4 \lfloor{\frac{15870}{4096}}\rfloor = 4 ⌊409615870⌋=4 个页面。
当页面大小为 512字节 时,共有 128 个页面,但程序共需 128 个页面,显然恰好能放下。
- 正文需要 ⌊ 32768 512 ⌋ = 64 \lfloor{\frac{32768}{512}}\rfloor = 64 ⌊51232768⌋=64 个页面。
- 数据需要 ⌊ 16386 512 ⌋ = 33 \lfloor{\frac{16386}{512}}\rfloor = 33 ⌊51216386⌋=33 个页面。
- 堆栈需要 ⌊ 15870 512 ⌋ = 31 \lfloor{\frac{15870}{512}}\rfloor = 31 ⌊51215870⌋=31 个页面。
42. 人们已经观察到在两次缺页中断之间执行的指令数与分配给程序的页框数直接成比例。如果可用内存加倍,缺页中断间的平均间隔也加倍。假设一条普通指令需要1 微秒,但是如果发生了缺页中断就需要 2001 微秒(即约2毫秒处理缺页中断)。假设一个程序运行了 60s,期间发生了 15000 次缺页中断,如果可用内存是原来的两倍,那么这个程序运行需要多少时间?
首先,处理 15000 次缺页中断需要额外的 15000 ∗ 2 毫秒 = 30 秒 15000 * 2毫秒 = 30秒 15000∗2毫秒=30秒,因此有 30秒在执行指令。内存翻倍后,按照题目中给出的经验,缺页中断会降低一半,因此处理缺页中断的时间降为 15秒,总时间降为 45秒。
43. Frugal 计算机公司有一组操作系统设计人员,他们正在考虑一种方法,以在新操作系统重减少对后背存储数量的需求。老板建议根本不要把程序正文保存在交换区中,而是在需要的时候直接从二进制文件中调页进来。在什么条件下(如果有这样的条件),这种想法适用于程序文本?在什么条件下,这种想法适用于数据?
It works for the program if the program cannot be modified. It works for the data if the data cannot be modified. However, it is common that the program cannot be modified and extremely rare that the data cannot be modified. If the data area on the binary file were overwritten with updated pages, the next time the program was started, it would not have the original data.
44. 有一条机器语言将要被调入,该指令可把一个32位字装入含有32位字地址的寄存器。这个指令可能引起的最大缺页中断次数是多少?
需要考虑两种因素:
- 指令或数据都可能引起缺页。
- 同一条指令或同一个32位字可能会跨页存储。
The instruction could lie astride a page boundary, causing two page faults just to fetch the instruction. The word fetched could also span a page boundary, generating two more faults, for a total of four. If words must be aligned in memory, the data word can cause only one fault, but an instruction to load a 32-bit word at address 4094 on a machine with a 4-KB page is legal on some machines (including the x86).
45. 解释内部分段和外部分段的区别。分页系统用哪一种?纯分段的系统用的又是哪一种?
这里要吐槽一下,翻译真是巨垃圾。不过还是只能怪自己英文不好。
题目中的内部分段和外部分段在原书中分别是 internal fragmentation 和 external fragmentation。这两个词出现在 3.5.3 节和 3.7.1 中,在那里被翻译成了内部碎片和外部碎片。
而且也不应该翻译成用哪一种。原文是 “Which one occurs in paging systems? Which one occurs in systems using pure segmentation?”,个人认为应该翻译为哪一种会出现在分页系统中?哪一种会出现在纯分段系统中。
以下是答案:
Internal fragmentation occurs when the last allocation unit is not full. External fragmentation occurs when space is wasted between two allocation units. In a paging system, the wasted space in the last page is lost to internal fragmentation. In a pure segmentation system, some space is invariably lost between the segments. This is due to external fragmentation.
46. 在 MULTICS 中,当同时使用分段和分页时,首先必须查找段描述符,然后页描述符。TLB 也是这样按照量级查找的方式工作吗?
不需要。如图 3-37 所示,MULTICS TLB 的比较域中包含了段号和虚拟页面地址,而且支持并行比对 16 个比较域。
47.一个程序中有两个段,段0中为指令,有读/执行保护。段1中为读/写数据,有读/写保护。内存是按需分页式虚拟内存系统,它的虚拟地址为4位页号,10位偏移量。页表和保护如下所示:
对于下面的每种情形,给出动态地址所对应的物理内存地址,或者指出发生了哪种失效。
- 读取页:段1,页1,偏移 3。物理内存地址:17。
- 存储页:段0,页0,偏移 16。无写权限。
- 读取页:段1,页4,偏移 28。发生缺页中断。
- 跳转到:段1,页3,偏移 32。无执行权限。
48. 你能想象在哪些情况下支持虚拟内存是个坏想法吗?不支持虚拟内存能得到什么好处?请解释。
General virtual memory support is not needed when the memory requirements of all applications are well known and controlled. Some examples are smart cards, special-purpose processors (e.g., network processors), and embedded processors. In these situations, we should always consider the possibility of using more real memory. If the operating system did not have to support virtual memory, the code would be much simpler and smaller. On the other hand, some ideas from virtual memory may still be profitably exploited, although with different design requirements. For example, program/thread isolation might be paging to flash memory.
49. 虚拟内存提供了进程隔离机制。如果运行两个操作系统同时运行,在内存管理上会有什么麻烦?如何解决这些困难?
This question addresses one aspect of virtual machine support. Recent attempts include Denali, Xen, and VMware. The fundamental hurdle is how to achieve near-native performance, that is, as if the executing operating system had memory to itself. The problem is how to quickly switch to another operating system and therefore how to deal with the TLB. Typically, you want to give some number of TLB entries to each kernel and ensure that each kernel operates within its proper virtual memory context. But sometimes the hardware (e.g., some Intel architectures) wants to handle TLB misses without knowledge of what you are trying to do. So, you need to either handle the TLB miss in software or provide hardware support for tagging TLB entries with a context ID.
没想明白该如何模拟操作系统对内存的关系,因此后续问题先略过了。