画出进程图:
原则如下:
(1) 遇到fork函数就分支,每个水平的箭头对应于从 左到右执行指令的进程,而每个垂直的箭头对应于 fork 函数的执行
(2) 分支的时候专注于父进程执行完,再处理另一个分支
(3) 父进程中, fork 返回子进程的 PID、在子进程中, fork 返回 0
(4) 在新的进程中可以认为执行的是上一个fork以下的部分。
对于执行过程,由于程序不会按照特定的顺序回收子进程,子进程回收的顺序是这台特定的计算机的属性。所以这个输出结果不是确定的,但是对于这道题,exit函数调用的输出一定是属于当前的进程的。所以(1,2),(0,2)一定是连在一起。可能的结果是
ACE:<1,1,2,0,0,2>,<1,0,2,1,2,0>,<1,0,0,2,1,2>
对于B和D,都没有满足(1,2)(0,2)连在一起的原则。
参考CSAPP的P506,可以看到这样的一段话:
5个信号连续发送,上下文没来得及切换,这 5 个信号就同时发送了。只有 2 个信号被接收。在第一个信号发给父进程之后,父进程进入 handler,并且阻塞了SIGUSR2,第二个信号依然可以发送,成为待处理信号;接下来的 3 个信号便会被简单丢弃。
因此想要解决这个因为“连续发送,”而导致的问题可以使用wait函数等待进程终止回收之后,再发送第二个信号。
分析,首先要确定VA,PA的大小:
(1)VA共有14位,首先观察9.6.4节示例的存储系统模型可知,VPO为VA的后6位,所以每个页面有2^6=64字节
VA的高8位作为VPN,其中TLB表格中有4个组,所以TLBI是2位,剩下的高6位为TLBT标志位
(2)PA共有12位,其中低6位为PPO,由于cacha有F组,所以CI有4位,4块,所以CO有2位,剩下的高6位为PPN,是cache的标志位CT。
A:将虚拟地址化为二进制:
VPN 为高 8 位,VPN=0x9,TLBT=0x2,TLBI=0x1,VPO=0x3C
(1)查找 TLB:根据 TLBI=0x1 去寻找第 0x1 组,其中标记为 0x2 的条目有效位为 0,所以不命中:
(2)查找 cache,由于不命中,所以去 cache 中寻找。首先去 PTE 页表中查找 VPN=9 位置的数据,其有效 位为 1,说明不缺页,得到 PPN=0x17,
C.拼接 PPN+PPO 得到如下物理地址 PPA:
字节偏移 CO=0x00,缓存索引 CI=1111=0xF,缓存标记就是 CT=PPN=0x17,查找缓存发现有效位为 0,不命 中,返回为——
根据以上分析可以得到如下物理地址引用:
A. 将VA=0x03a9转化为2进制:
B. 其中VPN为高8位置,VPN=0x0E,TLBT为高6位,TLBT=0x03,TLBI=0x2
(1) 查找TLB条目,可以看到第2组的03标记处有效位为0,所以不命中
(2) 继续查找页表条目,可以看到VPN=0E处有效位为1,得到PPN=0x11,所以不发生缺页
根据以上分析可以得到如下表格:
C.将PPN和PPO拼接,得到PA:
1 0 0 0 0 1 1 0 1 0 0 1
D.其中CT=PPN=0x11,CI=1010=0xA,CO=01=0x1,去cache中第0A组找到偏移量为1的块,由于标记位位0x2D,所以不命中。根据以上分析得到右下角的表格: