Clock及改进Clock置换算法实现Word文档格式.docx
- 文档编号:19473817
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:17
- 大小:105.30KB
Clock及改进Clock置换算法实现Word文档格式.docx
《Clock及改进Clock置换算法实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《Clock及改进Clock置换算法实现Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
二、系统分析与设计
在采用请求分页机制的操作系统中,当运行一个程序的时候,若要访问的页面不在内存中而需要把它们调入内存,但此时内存已无空闲空间,为了保证该进程能正常运行,需选择内存中暂时不用的页面调出到磁盘交换区。
选择调出哪个页面,由页面算法决定。
页面置换算法的好坏,直接影响系统的性能,所以一个好的页面置换算法,应尽可能选择调出较长时间内不会再访问的页面,以保证较低的缺页率。
2.1Clock页面置换原理描述
Clock算法的思想:
当某一页首次装入内存中时,则将该页框的使用位设置为1;
当该页随后被访问到时(在访问产生缺页中断之后),它的使用位也会被设置为1。
对于页面置换算法,用于置换算法,用于置换的候选页框集合(当前进程:
局部范围;
整个内存;
全局范围)被看做是一个循环缓冲区,并且有一个指针与之相关联。
当一页被置换时,该指针被设置成指向缓冲区中的下一页框。
当需要置换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一页框。
每当遇到一个使用位为1的页框时,操作系统就将该位重新置为0;
如果在这个过程开始时,缓冲区中所有页框的使用位均为0时,则选择遇到的第一个页框置换;
如果所有页框的使用位均为1时,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,置换该页框中的页。
2.2改进型Clock页面置换原理描述
改进型的Clock算法的思想:
在将一个页面换出时,如果该页已被修改过,便须将它重新写到磁盘上;
但如果该页未被修改过,则不必将它拷回磁盘。
同时满足这两条件的页面作为首先淘汰的页。
由访问位A和修改位M可以组合成下面四种类型的页面:
1类(A=0,M=0):
表示该页最近既未被访问、又未被修改,是最佳淘汰页。
2类(A=0,M=1):
表示该页最近未被访问,但已被修改,并不是很好的淘汰页。
3类(A=1,M=0):
最近已被访问,但未被修改,该页有可能再被访问。
4类(A=1,M=1):
最近已被访问且被修改,该页有可能再被访问。
在内存中的每个页必定是这四类页面之一,在进行页面置换时,其执行过程可分成以下三步:
(1)从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。
在第一次扫描期间不改变访问位A。
(2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。
在第二轮扫描期间,将所有经过的页面的访问位置0。
(3)如果第二步也失败,即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。
然后,重复第一步,如果仍失败,必要时再重复第二步,此时就一定能够找到被淘汰的页。
Clock置换算法流程图:
改进型置换算法流程图:
四、函数模块
主函数模块
函数名称:
intmain()
功能:
显示主菜单,调用函数
检测模块
boolinblock(intnum)、boolinblock2(intnum)
检测读入的页号是否存在内存中、检测页号是否在内存中并把访问位和修改位置1
修改模块
boolchange()、intwhichpage()
判断页面是否已经被修改、判断内存中第几个需要被置换
Clock模块
voidCLOCK(intnum)
实现Clock置换算法,完成页面置换
改进型Clock模块
voidLCOCK(intnum)
实现改进的ClockL置换算法,完成页面置换
五、系统调试与结果
六、程序清单
#include<
iostream>
stdlib.h>
time.h>
#defineN20//虚拟内存尺寸
usingnamespacestd;
intP;
intconstblockCount=3;
//内存中的物理块数
intcount=0;
intblock[blockCount];
intconstPageCount=15;
//总的页面数
intPage[PageCount];
intstate[blockCount];
//clock置换算法中,内存中的每个页面号对应的状态
intstate2[blockCount][2];
//二维数组,第一行第一列为访问位,第一行的第二列为修改位
doublelost=0.0;
voidgenerate_list(int*list,inte,intm,intt)
{
inti,j=0,q=P,r;
srand((unsigned)time(NULL));
while(j<
e)
{
for(i=j;
i<
j+m;
i++)
{
if(i==e)
break;
list[i]=(q+rand()%e)%N;
//保证在虚拟内存的页号内
}
j=i;
r=rand()%100;
if(r<
t)
q=rand()%N;
else
q=(q+1)%N;
}
}
//随机生产是否被修改的情况,prop(0……100),prop/100的概率为被修改
voidgenerate_modify(int*mo,inte,intprop)
inti,t;
for(i=0;
e;
t=rand()%100;
if(t>
prop)
mo[i]=0;
else
mo[i]=1;
//检测页号是否在内存中
boolinblock(intnum)
for(inti=0;
i<
blockCount;
if(block[i]==Page[num])
state[i]=1;
returntrue;
returnfalse;
//判断页面是否已经被修改
boolchange()
if((rand()%2+1)==1)
printf("
该页面被修改!
\n"
);
returntrue;
else
returnfalse;
//用于改进型clock置换算法,检测页号是否在内存中并把访问位和修改位置1
boolinblock2(intnum)
i++){
if(block[i]==Page[num]){
if(change()){
state2[i][0]=1;
state2[i][1]=1;
}
else{
//用于改进型clock置换算法,判断内存中第几个需要被置换
intwhichpage(){
intj;
for(j=0;
j<
j++)
if(state2[j][0]==0&
&
state2[j][1]==0)
returnj;
j++)
state2[j][1]==1)
state2[j][0]=0;
state2[j][0]=0;
returnwhichpage();
//简单Clock置换算法
if(inblock(num))
命中!
lost++;
for(inti=0;
printf("
物理块%d#中内容:
%d\n"
i,block[i]);
if(count==blockCount)
//lost++;
for(j=0;
)
{
if(state[j]==0)
{
break;
}
else{
state[j]=0;
j++;
j=j%3;
block[j]=Page[num];
state[j]=1;
for(inti=0;
i,block[i]);
else{
block[count]=Page[num];
count++;
//改进型clock置换算法
voidLCLOCK(intnum)
if(inblock2(num))
lost++;
j=whichpage();
state2[j][0]=1;
inta[N];
intmo[N];
intA=10;
inte,m,prop,t,j;
页面走向为:
"
generate_list(a,e,m,t);
generate_modify(mo,e,prop);
for(inti=0;
PageCount;
Page[i]=rand()%9+1;
%d"
Page[i]);
charch;
\t\t1Clock置换算法\n"
\t\t2改进型Clock置换算法\n"
\t\t3退出!
\n\n"
请输入算法序号:
\t\n"
while
(1){
scanf("
%c"
&
ch);
switch(ch){
case'
1'
:
lost=0;
count=0;
for(intm=0;
m<
m++)
state[m]=0;
for(intj=0;
block[j]=0;
for(inti=0;
读入Page[%d]\n"
i);
CLOCK(i);
printf("
页面访问次数:
%d\n缺页次数:
%0.lf\n"
PageCount,PageCount-lost);
缺页率为:
%0.001f\n"
(PageCount-lost)/PageCount);
\n请输入算法序号:
\t"
}break;
2'
lost=0;
count=0;
for(intm=0;
m<
blockCount;
m++)
for(intn=0;
n<
2;
n++)
state2[m][n]=0;
for(intj=0;
j<
j++)
block[j]=0;
for(inti=0;
i<
PageCount;
i++)
LCLOCK(i);
printf("
3'
exit(0);
return0;
七、实验心得
通过这两周的课程设计,让我加深了对操作系统的认识,了解了操作系统中各种资源分配算法的实现,特别是对虚拟存储,页面置换有了深入的了解,并能够用高级语言进行模拟演示。
不仅提高对操作系统的了解,这次的课程设计也使自己的C语言编程能力加强了不少。
虽然自己所做的很少也不够完善,但毕竟是我努力的结果。
我也体会到,任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效。
通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。
因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Clock 改进 置换 算法 实现