题目来源于王道论坛
假定题44给出的计算机M采用二级分页虚拟存储管理方式,虚拟地址格式如下:
页目录号(10位) | 页表索引(10位) | 页内偏移量(12位) |
请针对题43的函数f1和题44中的机器指令代码,回答下列问题。
(1)函数f1的机器指令代码占多少页?
(2)取第1条指令(push ebp)时,若在进行地址变换的过程中需要访问内存中的页目录和页表,则会分别访问它们各自的第几个表项(编号从0开始)?
(3)M的I/O采用中断控制方式。若进程P在调用f1之前通过scanf()获取n的值,则在执行scanf()的过程中,进程P的状态会如何变化?CPU是否会进入内核态?
补充:43. 已知,计算f(n)的C语言函数f1如下:
int f1(unsigned n){
int sum=1, power=1;
for(unsigned i=0;i<=n-1;i++){
power *= 2;
sum += power;
}
return sum;
}
将f1中的int都改为float,可得到计算f(n)的另一个函数f2。假设unsigned和int型数据都占32位,float采用IEEE 754单精度标准。 44. 在按字节编址的计算机M上,题43中f1的部分源程序(阴影部分)与对应的机器级代码(包括指令的虚拟地址)如下:
解答:
(1)函数f1的代码段中所有指令的虚拟地址的高20位相同,因此f1的机器指令代码在同一页中,仅占用1页。(1分)页目录号用于寻找页目录的表项,该表项包含页表的位置。页表索引用于寻找页表的表项,该表项包含页的位置。
(2)push ebp指令的虚拟地址的最高10位(页目录号)为00 0000 0001,中间10位(页表索引)为00 0000 0001,所以,取该指令时访问了页目录的第1个表项,(1分)在对应的页表中访问了第1个表项。(1分)
(3)在执行scanf()的过程中,进程P因等待输入而从执行态变为阻塞态。(1分)输入结束时,P被中断处理程序唤醒,变为就绪态。(1分)P被调度程序调度,变为运行态。(1分)CPU状态会从用户态变为内核态。(1分)