模拟请求分页系统中的地址变换过程
创建请求页表,通过编程模拟缺页中断和地址变换,实现请求调页功能和页面置换功能。
环境
JDK8+eclipse
步骤
(一)请求页表及快表的创建
0 | 1 | 2 | 3 | 4 | 5 |
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
物理块号:当页在外存时为外存的物理块号,在内存时为内存的物理块号。
状态位P:0为此页在外存,1为此页在内存。
访问字段A:该页被访问的次数。
修改位M:0为该页未被修改,1为该页被修改。
外存地址:等于该页的外存物理块号。
分析页表发现由于涉及多行多列数据的输入输出,所以需要创建一个二维数组,一行作为一页,各列作为组成页表的状态位P、修改位M等元素。但通过实际操作发现,在调用页表的i页中某一元素时,需要通过page[i][j]的方式,这样很难区分各个元素。因此将页表的各个元素分别用一维数组表示,页号用一维数组的下标表示,便解决了区分困难的问题,例如:页号为i的页的访问字段“visitA[i]”。
而分析快表发现其结构与页表相同,因此只需要创建一个一维数组来存放从页表中调入的页的页号即可。
(二)分析请求分页系统中的地址变换过程(下面出现的各方法均在(三)中展示)
分析流程图整理编程思路:
在进行地址变换时,首先输入请求访问的逻辑地址然后pageNum()方法计算出页号,if判断此页页号是否大于页表长度,如果大于则越界中断。(下图)
如果小于则for循环检索快表,if语句判断所要访问的页是否在快表里,如果找到,则修改访问位和修改位并输出物理地址(由于此操作需要在代码中多次出现所以将其写成一个方法,即方法changeAM())。(下图)
如果在快表中未找到要访问页,则应到内存中去查找该页,即if判断该页的页表项中状态位statusP[pageNum()]是否为1。若为1则表示已调入内存,这时应将该页写入快表(修改快表的方法为changeFast()),然后修改访问位和修改位并输出物理地址。(下图)
若该页尚未调入内存,即状态位statusP[pageNum()]为0,这时应产生缺页中断(缺页中断方法为MPI()),请求OS从外存把该页调入内存。(下图)
缺页中断(方法MPI()),请求OS将所缺之页调入内存,这时需要 if 判断内存是否已满,即内存大小 inStore 是否等于0,不为0则内存未满,将此页调入内存,内存空间大小减去为此页分配的空间(下图),
修改页表,修改快表,形成物理地址。为0则内存已满,需要将内存中访问次数(即访问位 visitA[])最少的页换出,即将状态位 statusP[min] 置为0,并将换出页所占的内存物理块分配给换入页。(下图)
同时需要 if 判断换出页是否被修改,即判断修改位 ChangeM[min] 是否为1,为1则被修改,将该页写回内存,为0则未被改变。(下图)
修改页表,修改快表,形成物理地址。(下图)
(三)构建的方法
1、pageNum() 方法:页号等于逻辑地址整除页面大小,返回页号(下图)
2、pageAdd() 方法:偏移量等于逻辑地址除以页面大小取余,返回偏移量(下图)
3、changeAM() 方法:修改访问位和修改位,形成物理地址(下图)
4、changePage() 方法:从外存读缺页,将请求页换入内存,修改页表,即换入页的状态位置为1( statusP[pageNum()]=1 )(下图)
5、changeFast() 方法:修改快表
(1)如果快表满(下图)
(2)如果快表未满(下图)
6、TrueAdd() 方法:形成物理地址(下图)
7、putFP() 方法:输出快表方法(下图)
8、putPage() 方法:输出页表方法(下图)
(四)运行结果示范
(注:页表中物理块号和外存地址相同时,说明该页在外存,此时的物理块号是此页在外存的物理块号,当该页被调入内存后,物理块号才会变成分配给它的内存物理块号)
结论
想要实现模拟请求分页系统中的地址变换,首先要分析页表的各个元素所代表的含义以及页表与外存、内存和快表之间的联系。页表就相当于一个记录本,上面记录着各个页的当前状态,系统通过检索页表上页的状态来对页进行调入调出操作。