操作系统大作业-二级页表

1.作业内容

假设某系统的进程虚拟地址为32位,使用12位=4KB长度的页面,页表也是分页存储管理,每个页表表目占4 Bytes。请你:
1)设计一个页表管理的数据结构;
2) 根据用户进程要访问的虚拟空间地址 x x x,同时假设要访问的页面已在内存,设计一个查找该虚拟地址对应的内存物理页框号 b b b和物理地址 y y y的算法,并试分析算法的复杂度。要求页表结构尽量简洁,查找算法开销小。

2.解答

1)设计一个页表管理的数据结构

页号 物理块号 状态位P 访问字段A 修改位M 外存地址

状态位P:指示该页是否已经调入内存。
访问字段A:记录本页在一段时间内的访问次数,供置换算法换出页面时参考。
修改位M:标识该页在调入内存后是否被修改过。如果应淘汰的页在执行中没有被修改过,不必调出,直接装入一个新页覆盖。若修改过,则需要调出到外存。
外存地址:指出该页在外存上的地址,通常是物理块号。
按字节编址,使用32位虚拟地址。每个进程有的 2 32 B = 4 G B 2^{32}B=4GB 232B=4GB虚拟地址空间,使用 2 12 B = 4 K B 2^{12}B=4KB 212B=4KB的页面, 2 32 / 2 12 = 2 20 2^{32}/2^{12}=2^{20} 232/212=220,即一个进程可以用 2 20 2^{20} 220个页面,需要 ≥ 20 / 8 = 3 B \ge 20/8=3B ≥20/8=3B的表目,题目中取页表表目 4 B 4B 4B。则每个进程页表空间 2 22 B = 4 M B 2^{22}B=4MB 222B=4MB。 22 + 12 > 32 22+12>32 22+12>32,所以页表不能全装在主存,需要用到二级页表。
低12位为页内偏移量,高20位采用二级页表。每个小页表可以放 2 10 = 1 K 2^{10}=1K 210=1K个页表表目,共 2 10 = 1 K 2^{10}=1K 210=1K个小页表。 2 10 ∗ 2 10 ∗ 2 12 = 2 32 2^{10}*2^{10}*2^{12}=2^{32} 210∗210∗212=232,正好填满 32 32 32位地址。为了对 1 K 1K 1K个小页表进行查找,需要一个页表表目,页表表目有 1 K 1K 1K个,共 10 10 10位,为 31 31 31~ 22 22 22位。小页表占 10 10 10位,为二级页号,为 21 21 21~ 12 12 12位。页面内的偏移量为 12 12 12位,对应 4 K B 4KB 4KB的页面,为 11 11 11~ 0 0 0位。

一级页号 二级页号 页内偏移量
31 31 31~ 22 22 22位 21 21 21~ 12 12 12位 11 11 11~ 0 0 0位

2)算法

先取地址的高 10 10 10位( 31 31 31~ 22 22 22位),在一级页表中查找而应页框号所在位置页表 x 31..22 x_{31..22} x31..22​。即 x 31..22 = x / 2 22 x_{31..22}=x/2^{22} x31..22​=x/222。访问 x 31..22 x_{31..22} x31..22​,得到虚拟页号的物理页表起始地址 b 1 b_1 b1​。再取 x x x的 21 21 21~ 12 12 12位,得到二级页号 x 21..12 = ( x m o d    2 22 ) / 2 12 x_{21..12}=(x \mod 2^{22})/2^{12} x21..12​=(xmod222)/212。将 b 1 b_1 b1​与 x 21..12 x_{21..12} x21..12​相加得到新地址,访问该地址,得到物理页框号 b b b。取 x x x的低12位页内偏移量 x 11..0 x_{11..0} x11..0​,将物理页框号 b b b与页内偏移量 x 11..0 x_{11..0} x11..0​拼接,得到物理地址 y = b ∗ 2 12 + x 11..0 y=b*2^{12}+x_{11..0} y=b∗212+x11..0​。
算法的流程图如下:
操作系统大作业-二级页表
算法时间复杂度分析:需要访问三次主存,一次访问页目录,一次访问页表,最后访问数据所在的物理地址,时间复杂度为 O ( 1 ) O(1) O(1)。
算法空间复杂度分析:以空间换时间。虚拟地址本身为32位,为4GB。根据一级页号查找页框号,这个页框号为20位,为1MB。
算法正确性、有效性分析:算法会检测越界中断与缺页中断,在没有越界和缺页的错误时能正常运行。

伪代码

int x31_22=x>>22;//位运算,右移22位
if (flag[x31_22]==1){//要访问的页是否在主存
	b1←x31_22地址内容;
	x21_12=(x>>12)/(1<<22);//位运算,取x的21~12位
	addr=x21_12+b1;
	if (addr<(1<<20)-1);{//判断是否越界
		b←addr地址内容;
		y=(b<<12)+x%(1<<12);//拼接b与x的低12位
	}
	else 越界中断
}
else 缺页中断
上一篇:习题10-3 递归实现指数函数 (15 分)


下一篇:[Python学习笔记-012]古巴比伦人的乘法表