操作系统课程设计报告页面置换算法模拟程序设计Word文档下载推荐.docx
- 文档编号:22463109
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:24
- 大小:131.67KB
操作系统课程设计报告页面置换算法模拟程序设计Word文档下载推荐.docx
《操作系统课程设计报告页面置换算法模拟程序设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告页面置换算法模拟程序设计Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
页面淘汰又称为页面置换。
若请求调页程序要调进一个页面,而此时该作业所分得的主存块已全部用完,则必须淘汰该作业已在主存中的一个页。
这时,就产生了在诸页面中淘汰哪个页面的问题,这就是淘汰算法(或称为置换算法)。
置换算法可描述为,当要索取一个页面并送入主存时,必须将该作业已在主存中的某一页面淘汰掉,用来选择淘汰哪一页的规则就叫做置换算法。
(2).各种页面置换算法的实现思想
OPT算法是当要调入一新页而必须先淘汰一旧业时,所淘汰的那一页应是以后不要再用的或是以后很长时间才会用到的页。
FIFO算法的实质是,总是选择在主存中居留时间最长(即最老)的一页淘汰。
其理由是最先调入主存的页面,其不再被使用的可能性比最近调入主存的页的可能性大。
LRU算法的实质是,当需要置换一页时,选择最长时间未被使用的那一页淘汰。
如果某一页被访问了,它很可能马上还要被访问;
相反,如果它很长时间未曾用过,看起来在最近的未来是不大需要的。
LFU即最不经常使用页置换算法,要求在页置换时置换在一定时期内引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。
本次设计取整个页面访问时期为计算周期,实际问题中应根据页面数量多少来确定周期。
选择置换算法,先输入所有页面号,为系统分配物理块,依次进行置换:
最佳置换算法(OPT):
是用一维数组page[PSIZE]存储页面号序列,memery[MSIZE]是存储装入物理块中的页面,用pflag[PSIZE]数组标记缺页中断处。
数组next[MSIZE]记录物理块中对应页面的最后访问时间。
每当发生缺页时,就从物理块中找出最后访问时间最大的页面,调出该页,换入所缺的页面,然后初始化next[MSIZE],便于下次使用。
【特别声明】
若物理块中的页面都不再使用,则每次都置换物理块中第一个位置的页面。
先进先出置换算法(FIFO):
采用队列的思想,总是把最先进入物理块中的页面放在第一个位置,当发生缺页时,就从队头删除一页,而从队尾加入缺页。
最久未使用置换算法(LRU):
是用一维数组page[PSIZE]存储页面号序列,memery[mSIZE]是存储装入物理块中的页面,用pflag[PSIZE]数组标记缺页中断处。
总是把最长时间内未被使用的页放在最后一块,当发生缺页时,就删掉最后一页,将当前所缺页面放入第一块。
最不经常使用淘汰算法(LFU):
用use[MSIZE]数组记录当前各页已使用次数,其中use[0]中存放使用次数最少的页的次数,当发生缺页时,就在已放入物理块的页中查找当前使用次数最少的页,将之删掉,并引入当前缺页页面。
main函数:
voidmain()
{
inti,k,code;
intmSize,pSize,page[PSIZE];
system("
color0A"
);
Designer();
printf("
┃请按任意键继续...┃\n"
┖─────────────────────────┚\n"
>
>
"
getchar();
cls"
//DOS命令,清除屏幕上的所有文字
color0B"
//改变控制台的前景和背景色
请输入物理块的个数[mSize<
=10]:
"
scanf("
%d"
&
mSize);
请输入页面数[pSize<
=50]:
pSize);
请输入页面序列[1~10之间]:
\n"
for(i=0;
i<
pSize;
i++)
scanf("
page[i]);
Download(pSize,mSize);
color0E"
do
{
printf("
即将进入物理块的页面序列为:
for(i=0;
printf("
%3d"
page[i]);
*****************************\n"
*请选择页面置换算法:
*\n"
*━━━━━━━━━━━━━━━━━━━━━━━━━━━*\n"
*1.最佳(OPT)2.先进先出(FIFO)3.最近最久未使用(LRU)*\n"
*4.最不经常使用(LFU,当前使用次数最少)5.退出*\n"
请选择操作:
[]\b\b"
&
code);
switch(code)
{
case1:
OPT(page,pSize,mSize);
break;
case2:
FIFO(page,pSize,mSize);
case3:
LRU(page,pSize,mSize);
case4:
LFU(page,pSize,mSize);
case5:
system("
Designer();
//显示设计者信息后退出
┃谢谢使用页面置换算法演示器!
正版授权㊣┃\n"
┗━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
exit(0);
default:
输入错误,请重新输入:
}
//printf("
按任意键重新选择置换算法:
getchar();
system("
pause"
//冻结屏幕
}while(code!
=5);
getchar();
}
OPT函数:
voidOPT(intpage[],intpSize,intmSize)
inti,j,k;
intcount=0;
//计数器
intmemery[MSIZE]={0};
//存储装入物理块中的页面
intnext[MSIZE]={0};
//记录物理块中对应页面的最后访问时间
sum=0;
j=0;
while((j<
mSize)&
&
(page[i]!
=memery[j]))//查页表,看是否缺页
j++;
if(j==mSize)
flag='
*'
;
//缺页,则置标志flag为'
sum+=1;
//记录缺页次数
if(sum<
=mSize)//如果物理块中有空余,则将当前页面直接放入
{
for(j=0;
j<
mSize;
j++)
{
if(memery[j]==0)
{
memery[j]=page[i];
break;
}
}
}
else//物理块已满的情况下
for(j=i+1;
j++)//查找以后不再使用或在最长时间以后才会用到的页
for(k=0;
k<
k++)
if(page[j]==memery[k])
{
next[k]+=1;
//记录将被使用的次数,可以不用累加
count++;
//记录物理块中以后将即被使用的页面个数
break;
}
if(count==mSize-1)break;
//如果已有mSize-1个页面即将被使用,则剩下最后一个页面一定是最长时间后才会用到的页
if(count==0)
memery[0]=page[i];
else
count=0;
if(next[k]==0)//总是置换出第一个可以换出的页
memery[k]=page[i];
next[k]=0;
//初始化next[]数组
}
elseflag='
'
pflag[i]=flag;
//记录当前页的缺页情况
for(k=0;
k++)//记录每一次的置换情况
table[k][i]=memery[k];
Compute();
showTable(page,pSize,mSize);
}
FIFO函数:
voidFIFO(intpage[],intpSize,intmSize)
inti,j;
for(i=0;
i++)//查页表,看是否缺页
{
=memery[j]))
j++;
for(j=mSize-1;
j>
0;
j--)//淘汰最先调入的页面,并调入当前页面
memery[j]=memery[j-1];
memery[0]=page[i];
for(j=0;
j++)
table[j][i]=memery[j];
LRU函数:
voidLRU(intpage[],intpSize,intmSize)
k=j-1;
else
k=j;
while(k>
0)//总是把最长时间内未被使用的页放在最后一页
memery[k]=memery[k-1];
k--;
memery[0]=page[i];
//调入当前页面
LFU函数:
voidLFU(intpage[],intpSize,intmSize)
inti,j,replace;
//replace标记使用次数最少的页
intuse[MSIZE]={0};
//记录当前各页已使用次数,其中use[0]中存放使用次数最少的页的次数
use[page[i]]+=1;
//下标即为页号
use[0]=100;
j++)//在已放入物理块的页中查找当前使用次数最少的页
if(use[memery[j]]<
use[0])
use[0]=use[memery[j]];
replace=j;
//标记页号
memery[replace]=page[i];
j++)//记录每一次的置换情况
辅助函数
Designer函数:
voidDesigner()
┏━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
┃◎◎◎课题:
页面置换算法◎◎◎┃\n"
┃◎◎◎学号:
11150038◎◎◎┃\n"
┃◎◎◎姓名:
李艳平◎◎◎┃\n"
┃◎◎◎<
VisualC++6.0>
◎◎◎┃\n"
mDelay函数:
voidmDelay(unsignedintDelay)
unsignedinti;
while(Delay>
0)
125;
i++)
\b"
Delay--;
Download函数:
voidDownload(intpSize,intmSize)
inti;
color0D"
┏┅┅┅┅┅┅┅┅┅┅┅┅┓\n"
┇正在载入数据,请稍后...┇\n"
┗┅┅┅┅┅┅┅┅┅┅┅┅┛\n"
Loading...\n"
0\n"
51;
\b"
50;
mDelay((pSize+mSize)/2);
\nFinish.\n载入成功,按任意键进入置换算法选择界面:
Compute函数:
voidCompute()
正在进行相关计算,请稍候...\n"
for(i=1;
i<
20;
i++)
mDelay(15);
if(i%4==0)
\b\b\b\b\b\b\b\b\b\b\b\b"
else
for(i=0;
i++<
30;
printf("
));
showTable函数:
voidshowTable(intpage[],intpSize,intmSize)
/*printf("
\n输出置换过程,“*”标记缺页中断处\n"
*/
table[i][j]);
%3c"
pflag[i]);
\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n"
总的缺页次数为:
%d\n"
sum);
缺页中断率为:
%.2lf%%\n"
100.0*sum/pSize);
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n"
#include<
stdio.h>
stdlib.h>
/*宏定义*/
#defineMSIZE10//最大物理块数
#definePSIZE50//最大页面数
/*全局变量*/
charflag,pflag[PSIZE];
//缺页标志
inttable[MSIZE][PSIZE];
//存放置换记录
intsum=0;
//记录每个算法的缺页次数
/*置换算法函数*/
voidOPT(intpage[],intpSize,intmSize);
//最佳置换算法
voidFIFO(intpage[],intpSize,intmSize);
//先进先出置换算法
voidLRU(intpage[],intpSize,intmSize);
//最久未使用置换算法
voidLFU(intpage[],intpSize,intmSize);
//最不经常使用淘汰算法(当前使用次数最少)
/*辅助函数*/
voidDesigner();
//显示设计者信息
voidmDelay(unsignedintDelay);
//设置延迟
voidDownload(intpSize,intmSize);
//载入数据
voidCompute();
//计算过程延迟
voidshowTable(intpage[],intpSize,intmSize);
//输出置换过程
【主函数及其他函数详见第四部分】
主要运行界面:
【运行环境——VisualC++6.0】
(1)按任意键继续:
(2)载入数据:
(3)进入置换算法选择界面:
(4)运算中延迟操作:
(5)四种算法演示结果:
(6)退出界面:
第七部分总结(特色、经验、教训和感受)
两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,如何去坚持一件事情,又如何完成一件事情。
在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告 页面 置换 算法 模拟 程序设计