实验3-页面调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
院(系):
专业班级:
学号:
姓名:
实验地点:
实验日期:
课程名称实验项目名称实验学时实验类型计算机操作系统页面调度算法 2 验证型
一、实验目的及要求
通过本实验可以加深理解有关虚拟存储器的工作原理,进一步体会和了解页面替换算法的具体实现方法。
二、实验环境
PC /Windows系统/Visual C++6.0
三、实验内容
①实现三种算法:先进先出;OPT;LRU
②页面序列从指定的文本文件(TXT文件)中取出
③输出:第一行:每次淘汰的页面号,第二行:显示缺页的总次数
四、实验步骤
1.先进先出(FIFO)置换算法的思路
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。
2.最近久未使用(LRU)置换算法的思路
最近久未使用置换算法的替换规则,是根据页面调入内存后的使用情况来进行决策的。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进行淘汰。
3.最佳(OPT)置换算法的思路
其所选择的被淘汰的页面,将是以后不使用的,或者是在未来时间内不再被访问的页面,采用最佳算法,通常可保证获得最低的缺页率。
4、流程图如下图所示:
五、调试过程 程序结构分析:
程序共有以下九个部分:
int findSpace(void);//查找是否有空闲内存
int findExist(int curpage);//查找内存中是否有该页面
开始 取一条指令
取指令中访问的页号=>L
查 页 表
页标记=1?
形成绝对地址
是“存”指令?
置L 页修改标记“1”
输出绝对地址
输出“*页号”
有后继指令?
取一条指令
结 束
J:=P[k]
J 页的修改标记
输出“OUTj ”
输出“INL ”
P[k]:=L k:=(k+1) mod m
修改页面
是
否
是 否
否(产生缺页中断)
是
否
int findReplace(void);//查找应予置换的页面
void display(void);//显示
void FIFO(void);//FIFO算法
void LRU(void);//LRU算法
void OPT(void);//OPT算法;
void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示int main() //主程序
六、实验结果及分析
程序源代码:
#include
#define Bsize 3
#define Psize 20
struct pageInfor
{
int content;//页面号
int timer;//被访问标记
};
class PRA
{
public:
PRA(void);
int findSpace(void);//查找是否有空闲内存
int findExist(int curpage);//查找内存中是否有该页面
int findReplace(void);//查找应予置换的页面
void display(void);//显示
void FIFO(void);//FIFO算法
void LRU(void);//LRU算法
void Optimal(void);//OPTIMAL算法
void BlockClear(void);//BLOCK恢复
pageInfor * block;//物理块
pageInfor * page;//页面号串
private:
};
PRA::PRA(void)
{
int QString[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};
block = new pageInfor[Bsize];
for(int i=0; i { block[i].content = -1; block[i].timer = 0; } page = new pageInfor[Psize]; for(i=0; i { page[i].content = QString[i]; page[i].timer = 0; } } int PRA::findSpace(void) { for(int i=0; i if(block[i].content == -1) return i;//找到空闲内存,返回BLOCK中位置return -1; } int PRA::findExist(int curpage) { for(int i=0; i if(block[i].content == page[curpage].content) return i;//找到内存中有该页面,返回BLOCK中位置 return -1; } int PRA::findReplace(void) { int pos = 0; for(int i=0; i if(block[i].timer >= block[pos].timer) pos = i;//找到应予置换页面,返回BLOCK中位置return pos; }