CLOCK时钟置换算法.docx
《CLOCK时钟置换算法.docx》由会员分享,可在线阅读,更多相关《CLOCK时钟置换算法.docx(26页珍藏版)》请在冰豆网上搜索。
CLOCK时钟置换算法
青岛理工大学
操作系统课程设计报告
院(系):
计算机工程学院
专业:
软件工程
学生姓名:
__
班级:
___ 学号:
题目:
采用CLOCK置换算法仿真请求分页系统
起迄日期:
2012.7.6--2012.7.13____
设计地点:
实验楼
指导教师:
2011—2012年度第2学期
完成日期:
2012年7月12日
一、课程设计目的
操作系统课程设计是为了对学习的操作系统课程更深刻的理解和巩固,对操作系统的整体进行一个模拟。
通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力;锻炼实际的编程能力、创新能力及团队组织、协作开发软件的能力;还能提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。
课程设计是自己独立完成一项任务的过程,编程过程中要充分调动个人的积极性,提高自身解决实际问题的能力,发现自身的编程错误习惯,提高编写程序的质量。
同时,也为以后深入层次的学习及研究打基础。
编程中少不了难题,遇到难题时需要的是用程序员的思维方式去考虑问题解决问题,还需要很大的精力和耐心,对于我们来说都是磨练和提高。
二、课程设计内容与要求
1、设计内容:
用高级语言编写和调试一个内存分配程序,加深对内存分配算法的理解。
2、设计要求:
1)实现请求分页存储管理方式的页面置换算法:
CLOCK算法
2)内存物理块数固定为15个,对多个作业采用可变分配全局置换的策略分配物理块
3)作业数量与作业大小(10-20页)可在界面进行设置
4)所有作业按RR算法进行调度,时间片长度为1秒
5)可为每个作业随机产生引用的页面串,也可以人工输入引用的页面串,页面串长度50---100,要求必须包括作业所有的页面,可作为样例数据保存
6)可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、页面串长度的初始化
7)要求采用可视化界面,模拟内存分配和使用情况图,可在运行过程中随时暂停,查看当前内存物理块使用情况。
8)每次全部作业运行结束后,要求打印出访问命中率
三、系统分析与设计
1、系统分析
CLOCK页面置换算法是根据进程的实际需要,动态地为之分配内存空间。
在实现可变分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区的分配和回收操作这样三个问题。
为了实现分区分配,系统中必须配置相应的数据结构,用来描述空闲区和已分配区的情况,为分配提供依据。
常用的数据结构有两种形式:
空闲分区表和空闲分区链。
为把一个新作业装入内存,须按照一定的算法,从空闲分区表或空闲分区链中选出一个分区分配给该作业。
在动态分区存储管理方式中,主要操作是分配内存和回收内存。
(1)信息。
本系统完成的是对作业数量不固定,作业大小、进入内存时间、运行时间需要通过界面进行输入,或者从文件读取的作业基本信息,内存(15——20)的处理信息是处理对于各种作业完成动态的内存分配,回收和紧凑。
(2)行为。
完全描述系统状态变化所需处理或功能;
本系统处理了RR时间片轮转算法对内存的动态分配,每一个作业都是按照先进先出的原则进入内存当地一个作业进入内存后,会长生一个时钟信号,依次递增,当一个作业从进入时间开始到运行时间结束,会动态的释放所占大小的内存区间,直到时钟信号等于最后一个作业释放他所占的内存区间,此时所有的作业运行完,内存也回收完。
(3)表示。
详细描述系统的对外接口与界面。
本系统采用的VC编写的,在DOS界面下运行
2、系统设计:
系统利用RR时间片轮转算法掉调度作业,并从内存区动态分配内存。
设内存区的大小为number,表中每个空闲分区的大小可表示为nunber个。
虚拟存储区采用page类型二维数组实现,然后将虚拟存储区的首址返回给调用者。
当进程运行完毕释放内存时,系统根据回收区的首址,从内存区表中按CLOCK算法找到相应的插入点。
2.1、模块设计:
RR算法(nextfit)(详见程序流程图)
先将所有的进程排成一队,按先来先服务原则排列,先调度首进程按时间片轮转执行。
当执行到队尾时再从头执行,详细参看课本95页3.3.3节时间片轮转法
改进型CLOCK算法(bestfit/worstfit)
根据页面的访问位A和修改位M确定调出页面执行四步循环找出要置换页面,详细介绍参看课本153页4.8.3节CLOCK置换算法
虚拟存储区
采用的page二维数组模拟
内存区定义如下
voidMemPageIinit(intnumber)//内存链
{
headptr=newpage;
tailptr=headptr;
for(inti=1;i{
tailptr->next=newpage;
tailptr=tailptr->next;
if(i==(number-1))
{
tailptr->next=NULL;
}
}
}
函数关系图
2.2、数据结构说明:
Structpage
{
数据对象job:
page的作业号,int型。
数据对象*next:
page的后继指针。
数据对象pageID:
page的页号,int型。
数据对象A:
访问码,int型。
数据对象M:
修改码int型。
数据关系R:
数据元素同属一个集合。
基本操作P:
MemPageIinit(intnumber)
初始条件:
指向newpageheadptr指针
操作结果:
构造一个number大小的指针链。
ProcessPageInit()
初始条件:
i=PPAGENUMBER1,j=PPAGENUMBER2大小page类型的二维数组。
操作结果:
数组各项赋初值。
rr()
初始条件:
操作结果:
各个作业按时间片轮转算法调度
sleep(clock_twait)
初始条件:
clock_t=1000
操作结果:
程序循环一秒
ClockReplace(page*paget)
初始条件:
指向要调入页指针paget
操作结果:
按CLOCK算法调换页面
ShowPage1()
初始条件:
操作结果:
显示内存调用情况。
ReplacePage(page*preptr,page*ptr,page*paget)
初始条件:
指向要被替换掉页面指针的前序指针preptr,指向要被替换掉页面指针ptr,指向要调入页指针pagetpaget
操作结果:
调换paget和ptr
};
程序中主要用到指针链表模拟内存区,
2.3、算法流程图:
函数关系图
RR算法rr()及其调用函数sleep()
Y
Y
Y
Y
N
N
CLOCK页面置换算法
N
N
Y
N
Y
Y
N
N
四、系统测试与调试分析
1、系统测试
2、调试分析:
进入程序输入‘1’显示随机产生的多个作业的页面信息
输入2开始执行CLOCK页面置换算法
五、用户手册
1、使用平台是什么?
下载网址?
使用的VC++平台
2、是否需要安装?
如需要安装,如何安装?
不需要安装
3、说明如何使用你编写的程序,详细列出每一步的具体操作步骤。
这里可以有适当的运行结果抓图。
程序运行效果图
六、程序清单
voidProcessPageInit()//页面初始化引用串
{
srand((unsigned)time(NULL));
inta;
for(inti=0;i{for(intj=0;j{a=rand()%15;
a=a+1;
//printf("a:
%d",a);
processpage[i][j].pageID=a;
processpage[i][j].A=0;
processpage[i][j].M=0;
processpage[i][j].next=NULL;
processpage[i][j].job=i;
}
//printf("\n");
}
//printf("dsfds%o",processpage[0][0].next);
//ShowPage();
}
voidMemPageIinit(intnumber)//内存链
{
headptr=newpage;
tailptr=headptr;
for(inti=1;i{
tailptr->next=newpage;
tailptr=tailptr->next;
if(i==(number-1))
{
tailptr->next=NULL;
}
}
}
voidrr()
{
//printf("%d%d",i,j);
for(;i{
//printf("%d",i);
j=pages[i];
//sleep((clock_t)1*CLOCKS_PER_SEC);
sleep(100);
pages[i]=j;
if(i==PPAGENUMBER1-1&&j==PPAGENUMBER2-1)
break;
elseif(i==PPAGENUMBER1-1)
i=0;
Sleep(500);
}
}
voidsleep(clock_twait)
{
clock_tgoal;
goal=wait+clock();
page*paget;
while(goal>clock())
{
//printf("once%d%d\n",i,j);
if(i==0&&j==0)
{
page*p;
p=headptr;
inta;
srand((unsigned)time(NULL));
for(;1;j++)
{
a=rand()%2;
p->A=processpage[i][j].A;
p->M=a;
p->pageID=processpage[i][j].pageID;
p=p->next;
//ShowPage1();
if(p==NULL)
{
break;
}
}
j++;
ShowPage1();
}
else
{
//printf("j:
%d\n",j);
paget=&processpage[i][j];
ClockReplace(paget);
ShowPage1();
printf("i:
%dj:
%d\n",i,j);
if(i==PPAGENUMBER1-1&&j==PPAGENUMBER2-1)
break;
elseif(j==PPAGENUMBER2-1)
{//printf("19\n");
break;//?
}
j++;
}
}
cout<<"*********************************************************************"<}
voidClockReplace(page*paget)
{
//printf("go");
page*preptr;
intfalg_A=0,falg_M=0;
preptr=headptr;
//while(preptr->next->next!
=NULL)preptr=preptr->next;
curptr=headptr;
//preptr=tailptr;
while
(1)
{
if(paget->pageID==curptr->pageID&&paget->job==curptr->job)//modifyacess
{
curptr->A=1;
k++;
break;
}
else
{
if((curptr->A==falg_A)&&(curptr->M==falg_M))
{
ReplacePage(preptr,curptr,paget);
l++;
break;
}
if(falg_M==1)//
(2)
{
curptr->A=0;
}
preptr=curptr;
curptr=curptr->next;
if(curptr==NULL)
{
if(falg_M==0)
{
falg_M=1;//
(2)
}
else
{
falg_M=0;
}
preptr=headptr;
curptr=headptr;
}
}
}
}
voidReplacePage(page*preptr,page*ptr,page*paget)
{
//cout<<"here";
page*tempptr;
tempptr=ptr;
inta;
srand((unsigned)time(NULL));
a=rand()%2;
if(ptr==headptr)
{
paget->next=headptr->next;
ptr=preptr=headptr=paget;
}
elseif(ptr->next==NULL)
{
ptr=paget;
preptr->next=paget;
}
else
{
paget->next=ptr->next;
preptr->next=paget;
}
processpage[i][j].A=1;
processpage[i][j].M=a;
//if(tempptr==NULL)printf("NULL\n");
//free(tempptr);
}
voidShowPage()
{
cout<<"*********************************************************************"<cout<<"PageID:
";
for(inti=0;i{
for(intj=0;j{
cout<}
cout<cout<<"A:
";
for(intit=0;it{
cout<}
cout<cout<<"M:
";
for(intic=0;ic{
cout<}
cout<}
}
voidShowPage1()
{
page*ptr;
ptr=headptr;
cout<<"MemeryPage"<cout<<"MemPgeID:
";
while(ptr!
=NULL)
{
cout<pageID<<"";
ptr=ptr->next;
}
ptr=headptr;
cout<cout<<"A:
";
while(ptr!
=NULL)
{
cout<A<<"";
ptr=ptr->next;
}
ptr=headptr;
cout<cout<<"M:
";
while(ptr!
=NULL)
{
cout<M<<"";
ptr=ptr->next;
}
ptr=headptr;
cout<}
intmain()
{
ProcessPageInit();//页面初始化
MemPageIinit(15);//内存初始化
stringstrcmd;
intpageid,a,m;
cout<<"请输入命令:
"<cout<<"user\\>";
cin>>strcmd;
while(strcmd!
="exit")
{
if(strcmd=="help")
{
cout<<"命令功能"<cout<<"setpage:
设置页面信息"<cout<<"showpage:
状态显示"<cout<<"replace:
Clock页面置换"<cout<<"exit:
退出程序"<}
elseif(strcmd=="1")
{
//ShowPage();
ShowPage1();
}
elseif(strcmd=="3")
{
//RunMempage();
rr();
doublez;
z=100*k/(l+k);
printf("%d,%d,%f\n",k,l,z);
//ShowPage1();
}
elseif(strcmd=="2")
{
cout<<"pleaseinputPageID,flagA,falagM:
"<cin>>pageid>>a>>m;
//SetPage(pageid,a,m);
}
else
{
cout<<"invalidationcommand,pleaseinput:
help"<}
cout<<"user\\>";
cin>>strcmd;
}
return0;
}七、体会与自我评价
八、参考文献
[1]汤子瀛编著,计算机操作系统(修订版),西安电子科技大学出版社,2001年
[2]严蔚敏编著,数据结构(C语言版),清华大学出版社,2010年
[3]谭浩强编著,C程序设计(第三版),清华大学出版社,2009年
[4]黄维通,姚瑞霞.VisualC++程序设计教程[M].北京:
机械工业出版社,2001.7
[5]胡志坤.VisualC++通信编程工程实例精解[M].北京:
机械工业出版社,2007.68-69
九、课程设计评价(由任课教师填写)
课程设计评价
成绩:
教师:
年月日