OPT算法和简单文本编辑器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通达学院
专业课程设计I 题目1 OPT算法模拟实现
题目2 文本编辑器
专业
学生姓名
班级学号
指导教师
指导单位计算机学院、软件学院日期
OPT算法模拟实现(OS类)
一、课题内容和要求
内容:学习虚拟存储机制中页面调度算法,通过编程模拟实现页面调度的OPT算法,进一步理解页面调度的OPT算法的概念及含义,提高对OPT页面调度算法的认识,同时提高自己动手实践的能力。加深对主存与辅助存储器统一管理、逻辑地址与物理地址转换、页序列走向的装入和替换问题的理解,同时有利于对存储技术的理解。
要求:利用C语言或是C++设计编程,完成OPT算法的设计,表示页序列走向的装入和替换,算出缺页中断率。
二、概要设计
OPT算法即最佳优先算法,实质是通过调页功能和页面置换功能,陆续把即将要运行的页面调入内存,并且把暂时不运行的页面从内存在删除,置换时以页面为单位,算出缺页次数和缺页率,缺页数用diseffect 表示,页面序列数m,初始值diseffect=0,缺页率= diseffect /m。
用C语言设计OPT算法的程序,可以模拟实现算法,在理论联系实际的基础上,分析各个OPT页面置换算法的直接访问或是缺页中断,然后替换的过程。为了能实现OPT请求调页和置换功能,在VC++6.0上编程模拟实现。该算法选择永不使用的或是在最长时间内不再被访问的页面进行置换,这是理想化算法,具有最好的性能,淘汰访问串中将来再也不出现的或者是在离当前最远的位置上出现的页,这样淘汰掉该页将不会造成因需要访问该页又立即把它调入的现象。这种算法难以实现,因为它要求必须预先知道每一个进程的访问串。实验中在对操作系统的整体把握上,将操作系统的OPT算法用于实践中去,模拟出页面调度算法得出缺页率。
具体实验程序流程图如下:
三、详细设计
给出一串页面序列的走向,每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面。实现它的装入和替换的过程,给出OPT页面调度算法的存储结构,算出缺页率。下表所示是实验过程中举得例子,其中-1表示缺页。
(1)延时程序mDelay,应用在页面初始时延时显示初始界面信息:
void mDelay(unsigned int Delay)
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i++)
{
printf(" \b");
}
}
}
(2) OPT算法的主要部分完成判定内存是否为空,若是在页面中直接访问,若不在判断是否需要置换,插入页面序列的下一个数的操作。void OPT()反映出页面置换的过程,并统计OPT页面置换算法的缺页情况。其中缺页的次数为diseffect。下面是算法主要代码:
void OPT(int n,int m,STORAGE storage[N],PAGE page[M])
{
int i,j,k,full=0,diseffect=0,time[M],base=0,equal[N],times=0;//若full=n则内存满,time[M]是为实现置换所设置的page[M]的备份数据栈
int t;
for(i=0;i { time[i]=page[i].pagenum; }//备份page[M] printf("当前内存中的页(-1代表无页):"); for(j=0;j printf(" %d\t",storage[j].pagenum); printf("\n"); for(i=0;i { for(j=0;j { if(storage[j].pagenum==page[i].pagenum) { page[i].framenum=storage[j].framenum; page[i].status=1; base++; //从栈中删除已访问的页 printf("直接访问,页%d已在帧%d中",page[i].pagenum,page[i].framenum); } //该页在内存,直接访问 } if(page[i].status==0) { diseffect++; if(full { for(j=0;j { if(storage[j].status==0) { storage[j].pagenum=page[i].pagenum; storage[j].status=1; page[i].framenum=storage[j].framenum; page[i].status=1; base++;//从栈中删除已访问的页 printf("缺页中断,页%d装入帧%d中",page[i].pagenum,page[i].framenum); full++; break; } } } //有空闲页帧,调入内存并访问相关指令 else { for(t=base+1;t { times=0; for(k=0;k if(storage[k].pagenum==time[t]) { equal[k]=1;break; } for(k=0;k if(equal[k]==1)