OS页面置换算法模拟实现.docx
《OS页面置换算法模拟实现.docx》由会员分享,可在线阅读,更多相关《OS页面置换算法模拟实现.docx(20页珍藏版)》请在冰豆网上搜索。
![OS页面置换算法模拟实现.docx](https://file1.bdocx.com/fileroot1/2023-1/21/50b1bfd6-d5e1-442e-ae9b-639e7a6dc025/50b1bfd6-d5e1-442e-ae9b-639e7a6dc0251.gif)
OS页面置换算法模拟实现
课程设计报告
操作系统原理
专业
计算机科学与技术
学生姓名
班级
学号
指导教师
完成日期
博雅学院
题目:
页面置换算法的模拟实现
一、设计目的
本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容
(1)概述
在进程运行过程中,若其所要访问的页面不在内存所需把他们调入内存,但内存已无空闲时,为了保证进程能够正常运行,系统必须从内存中调入一页程序或数据送磁盘的对换区中。
但应将那个页面调出,须根据一定的算法来确定。
通常,把选择换出页面的算法称为页面置换算法。
置换算法的好坏,将直接影响到系统的性能。
一个好的页面置换算法,应具有较低的页面更换频率。
从理论上将讲,应将那些以后不再访问的页面换出,或把那些较长时间内不再访问的页面调出。
目前存在着不同的算法,他们都试图更接近与理论上的目标。
拥有页面交换机制的操作系统总是把当前进程中急需处理的部分页面换入到内存当中,而把更多暂时不需要处理的页面放置在外存当中。
由于进程需要处理的页面顺序不同,因此必须要在内存与外存之间进行页面交换,页面置换算法也就应运而生。
(2)设计原理
1.先进先出(FIFO)算法
这是最早出现的置换算法。
该算法总是淘汰最先进入内存的页面,即选择在内存停留时间最久的给予淘汰。
该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替代指针,使它总是指向最老的页面。
但该算法与进程实际运行的规律不相适应,因为在incheng中,有些页面经常被访问,比如,含有全局变量,常用函数,例程等方面,FIFO
算法并不能保证这些页面不被淘汰。
当需要选择一个页面淘汰时,总是选择最先进入内存空间的那一个页面。
只要在系统中建立一个FIFO队列,以反映页面的活动情况。
被选择的页面总是处于队首的页面,而最近调入的页面永远存放在队列的尾部。
2.最近最久未使用(LRU)算法
FIFO置换算法的性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后不能反映页面的使用情况。
最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。
由于无法预测各个页面将来的使用情况,只能利用“最近的过去”,作为“最近的将来”的近似。
该算法的基本思想是用最近的过去估计最近的将来。
假定在内存中的某个页面,在最近一段时间内未被使用的时间最长,那么在最近的将来也可能不再被使用。
3.理想页面置换(OPT)算法(本次程序中作两个置换算法对比作用)
最佳置换算法由Belady于1966年提出,这是一种理想情况下的页面置换算法,但实际上不可能实现。
但人们目前把还无法预知一个进程在内的若干页面中,哪一个页面是未来最长时间内不再被访问,因而该算法无法实现。
基本思想是内存中每个页都用该页面首次被访问前所要执行的指令数进行标记,标记最大的页应该被置换
(3)详细设计及编码
1.模块设计
1.进入系统模块。
进入登陆界面,输入内存页面数和实际页数
2.页面号打印模块。
打印输入的页面号。
3.菜单选择模块。
选择相应的页面的置换方式,选择相应的字母,进入相应的功能。
4.算法模块。
选择相应的页面置换算法。
5.显现输出模块。
显示页面被置换的情况。
5.缺页次数和缺页率模块。
计算页面号输入的计算结果。
6.退出系统模块。
退出置换页面。
(见图3-1模块划分)
2.系统详细设计
2.1系统主界面设计(包含登陆模块设计)
1.首先贯穿全局的全局需要一系列的函数来实现本操作系统的各种功能。
需要函数自带的文件stdafx.h和iostream.h首先输入的页数自定义最大值为40程序用#defineM40实现。
为了防止输入的页数太多,超出自定义40个数的范围,通过输入函数实现。
:
intInput(intm,Prop[M])//输入函数
2.然后进入的系统模块。
首先通过打印当前的页面
voidprint(Pro*page1)//打印当前的页面
{
Pro*page=newPro[N];
page=page1;
for(inti=0;icout<}
查找内存中是否存在要调入的页面
intSearch(inte,Pro*page1){
Pro*page=newPro[N];
page=page1;
for(inti=0;ireturn-1;}
找出离现在时间最长的页面
intMax(Pro*page1){
Pro*page=newPro[N];
page=page1;
inte=page[0].time,i=0;
while(i{if(ei++;
}
for(i=0;ireturn-1;
}
找到最久不使用的页面
intCompfu(Pro*page1,inti,intt,Prop[M])
{Pro*page=newPro[N];
page=page1;
intcount=0;
for(intj=i;j{if(page[t].num==p[j].num)break;
elsecount++;
}
returncount;
}
3.FIFO页面置换和缺页次数及缺页率模块实现如下:
if(c=='1')//FIFO页面置换
{n=1;
cout<<"页面置换情况:
"<while(i{if(Search(p[i].num,page)>=0)i++;//找到相同的页面
else
{if(t==N)t=0;
else
{n++;
page[t].num=p[i].num;
print(page);
t++;
}
}
}
cout<<"缺页次数:
"<"<}
LRU页面置换和缺页次数及缺页率模块实现如下:
if(c=='2')//LRU页面置换
{n=1;
cout<<"页面置换情况:
"<while(i{intk;
k=t=Search(p[i].num,page);
if(t>=0)
page[t].time=0;
else
{n++;
t=Max(page);
page[t].num=p[i].num;
page[t].time=0;
}
if(t==0){page[t+1].time++;page[t+2].time++;}
if(t==1){page[2].time++;page[0].time++;}
if(t==2){page[1].time++;page[0].time++;}
if(k==-1)print(page);
i++;
}
cout<<"缺页次数:
"<"<}
OPT页面置换和缺页次数及缺页率模块实现如下(本代码在页面置换中:
if(c=='3')//OPT页面置换
{
n=1;
while(i{
if(Search(p[i].num,page)>=0)i++;
else
{
inttemp=0,cn;
for(t=0;t{
if(temp{
temp=Compfu(page,i,t,p);
cn=t;
}
}
page[cn]=p[i];
n++;
print(page);
i++;
}
}
cout<<"缺页次数:
"<"<}
图3-3系统流程图
3.系统流程图(见图3-3系统流程图)
(4)结果及分析
4.1测试方案
1.测试方案
(一)
输入可用页面为3,实际页数是20,各个页面号70120304230321201701(课本例题)选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)。
2.测试方案
(二)
输入可用页面为3,实际页数是20,各个页面号10710212230340302107选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比1)
3.测试方案(三)
输入可用页面为4,实际页数是20,各个页面号70120304230321201701(课本例题)选择实验要求FIFO页面置换,然后选择LRU算法。
最后选择OPT(对比)
4.2测试结果
1.测试方案
(一)结果。
输入可用页面为3,实际页数是20,各个页面号70120304230321201701测试成功。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-2FIFO页面置换界面)
图4-1输入页面登陆与输入
图4-2FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-3LRU页面置换界面)
图4-3LRU页面置换界面
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-4OPT页面置换界面)
图4-43OPT页面置换界面
2.测试方案
(二)结果。
输入可用页面为3,实际页数是20,各个页面号10710212230340302107测试成功。
见图(图4-5输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-5FIFO页面置换界面)
图4-5输入页面登陆与输入
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-6LRU页面置换界面)
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-7OPT页面置换界面)
图4-6LRU页面置换界面图4-7OPT页面置换界面
3.测试方案(三)结果。
输入可用页面为3,实际页数是20,各个页面号70120304230321201701测试成功。
见图(图4-1输入页面登陆与输入)选择FIFO页面置换时显示页面置换情况、缺页次数和缺页率(见图4-8FIFO页面置换界面)
图4-8FIFO页面置换界面
选择LRU页面置换时显示页面置换情况、缺页次数和缺页率(见图4-9LRU页面置换界面)
选择OPT页面置换时(对比)显示页面置换情况、缺页次数和缺页率(见图4-10OPT页面置换界面)
图4-9LRU页面置换界面图4-9LRU页面置换界面
4.3测试结果分析
从上述结果可知,在内存页面为3个页面时,由于用户进程的所有指令基本上都没装入内存,只装入一小部分,从而算法之间的差别比较大。
三种算法的访内命中率大致在45%至75%之间变化。
但是,FIFO算法与OPT算法之间的差别一般在25个百分点左右。
比较上述三种算法,以OPT算法的命中率最高,LRU算法次之,其次是FIFO算法。
(5)设计小结
通过本次的课程设计,使我能够正确运用操作系统课程中所学的基本理论和知识,加深了对请求调页存储管理系统基本概念的理解,还有让我感受很深的是对C++语言的应用,由于对C++语言在平时运用的不够,在对C++语言的使用尤其是在编写代码方面很欠缺,在组织语言时出错不断。
在设计过程中,需要大量的相关资料,为了本次课程设计我在网上和图书馆查阅了大量资料,不断的发现问题、提出问题、解决问题。
在编程和调试的过程中,经常会出现意想不到的问题,并非每个问题都可以从相关资料中找到解决方法,有些问题是无法预料到的,这就需要通过自己理性的分析得出问题的解决方案。
在对自己所编写的源程序段的纠错的过程中,使我更好的理解了请求调页存储管理系统的理论知识,同时在编程时用到了模块化的设计思想,这种编程方法可以使我们的编程变的更简单,可以使我们的查错与纠错变的更方便,总的来说通过这次的设计的学习使我学到了很多在平时的学习中学不到的很多东西,通过这次课程设计,使我对操作系统产生了极大的兴趣,我想我会在这条路上继续前进下去。
我相信,只要不断的严格要求自己,注意培养自己的思维能力,就一定会有更大更辉煌的发展和提高。
我还希望我们可以有更多这样的学习机会,使我们的知识体系变的更加牢固。
(6)参考文献
2.严蔚敏,吴伟民,数据结构,清华大学出版社,1997.4
3.张尧学,史美林,计算机操作系统教程,清华大学出版社,2000.8
4.孙静宇,计算机操作系统课程设计指导书,太原理工出版社,
2006.4
5.汤子瀛,哲凤屏,汤小丹,计算机操作系统,西安电子科技大
学出版社,2000,12
(7)课程设计代码
#include
#defineM40
intN;
structPro//结构体
{
intnum,time;
};
intInput(intm,Prop[M])//输入函数
{
cout<<"请输入实际页数:
";
do
{
cin>>m;
if(m>M)cout<<"数目太多,请重试"<elsebreak;
}
while
(1);
cout<for(inti=0;i{
cin>>p[i].num;
p[i].time=0;
}
returnm;
}
voidprint(Pro*page1)//打印当前的页面
{
Pro*page=newPro[N];
page=page1;
for(inti=0;icout<}
intSearch(inte,Pro*page1)//查找内存中是否存在要调入的页面
{
Pro*page=newPro[N];
page=page1;
for(inti=0;ireturn-1;
}
intMax(Pro*page1)//找出离现在时间最长的页面
{
Pro*page=newPro[N];
page=page1;
inte=page[0].time,i=0;
while(i{
if(ei++;
}
for(i=0;ireturn-1;
}
intCompfu(Pro*page1,inti,intt,Prop[M])//找到最久不使用的页面
{
Pro*page=newPro[N];
page=page1;
intcount=0;
for(intj=i;j{
if(page[t].num==p[j].num)break;
elsecount++;
}
returncount;
}
intmain()
{
cout<<"可用内存页面数"<cin>>N;
Prop[M];
Pro*page=newPro[N];
charc;
intm=0,t=0;
floatn=0;
m=Input(m,p);
do{
for(inti=0;i{
page[i].num=0;
page[i].time=2-i;
}
i=0;
cout<<"f:
FIFO页面置换"<cout<<"l:
LRU页面置换"<cout<<"o:
OPT页面置换"<cout<<"按其它键结束"<cin>>c;
if(c=='f')//FIFO页面置换
{
n=1;
cout<<"页面置换情况:
"<while(i{
if(Search(p[i].num,page)>=0)i++;//找到相同的页面
else
{
if(t==N)t=0;
else
{
n++;//
page[t].num=p[i].num;
print(page);
t++;
}
}
}
cout<<"缺页次数:
"<"<}
if(c=='l')//LRU页面置换
{n=1;
cout<<"页面置换情况:
"<while(i{
intk;
k=t=Search(p[i].num,page);
if(t>=0)
page[t].time=0;
else
{
n++;
t=Max(page);
page[t].num=p[i].num;
page[t].time=0;
}
if(t==0){page[t+1].time++;page[t+2].time++;}
if(t==1){page[2].time++;page[0].time++;}
if(t==2){page[1].time++;page[0].time++;}
if(k==-1)print(page);
i++;
}
cout<<"缺页次数:
"<"<}
if(c=='o')//OPT页面置换
{
n=1;
while(i{
if(Search(p[i].num,page)>=0)i++;
else
{
inttemp=0,cn;
for(t=0;t{
if(temp{
temp=Compfu(page,i,t,p);
cn=t;
}
}
page[cn]=p[i];
n++;
print(page);
i++;
}
}
cout<<"缺页次数:
"<"<}
}while(c=='f'||c=='l'||c=='o');
return0;
}