操作系统实验报告材料6页面置换算法模拟.docx
- 文档编号:11503630
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:20
- 大小:84.24KB
操作系统实验报告材料6页面置换算法模拟.docx
《操作系统实验报告材料6页面置换算法模拟.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告材料6页面置换算法模拟.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统实验报告材料6页面置换算法模拟
实验报告
(2013/2014学年第1学期)
课程名称
操作系统原理
实验名称
实验6:
页面置换算法模拟
实验时间
2013
年
12
月
10
日
指导单位
软件工程系
指导教师
杨健
学生姓名
班级学号
学院(系)
软件工程系
专业
计算机软件与服务外包
实验名称
实验1:
Linux操作、使用、编程与进程创建
指导教师
杨健
实验类型
实验
实验学时
2
实验时间
2013.12.10
一、实验目的
1.通过模拟实现几种基本页面置换的算法,了解虚拟存储技术的特点。
2.掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想,并至少用三种算法来模拟实现。
3.通过对几种置换算法页面的比较,来对比他们的优缺点,并通过比较更换频率来对比它们的效率。
二、实验环境(实验设备)
Windows2000
VisualStudio
三、实验内容
设计一个虚拟存储区和内存工作区,并使用下述算法来模拟实现页面的置换:
1.先进先出的算法(FIFO)
2.最近最久未使用算法(LRU)
3.最佳置换算法(OPT)
实验分析
在进程运行过程中,若其所访问的页面不存在内存而需要把它们调入内存,但内存已无空闲时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。
但应调出哪个页面,需根据一定的算法来确定,算法的好坏,直接影响到系统的性能。
一个好的页面置换算法,应该有较低的页面更换频率。
假设分给一作业的物理块数为3,页面数为20个。
页面号为(20个):
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
1.先进先出(FIFO)置换算法的思路
该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。
2.最近久未使用(LRU)置换算法的思路
最近久未使用置换算法的替换规则,是根据页面调入内存后的使用情况来进行决策的。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间,当需淘汰一个页面的时候选择现有页面中其时间值最大的进
行淘汰。
3.最佳(OPT)置换算法的思路
其所选择的被淘汰的页面,奖是以后不使用的,或者是在未来时间内不再被访问的页面,采用最佳算法,通常可保证获得最低的缺页率。
4.FIFO页面置换算法
当需要访问一个新的页面时,首先调用findExist(i)函数来查看物理块中是否就有这个页面,若要查看的页面物理块中就有,则调用display函数直接显示,不需要替换页面;如果要查看的页面物理块中没有,就需要寻找空闲物理块放入,若存在有空闲物理块,则将页面放入;若没有空闲物理块,则调用findReplace函数替换页面。
并将物理块中所有页面timer++。
5.LRU页面置换算法
当需要访问一个新的页面,首先调用findExist(i)函数查看物理块中是否就有这个页面。
6.OPT页面置换算法
当需要访问一个新的页面,首先调用findExist(i)函数来查看物理块中是否有这个页面。
7.寻找置换页面函数findReplace比较三个物理块中的时间标记timer,找到时间最久的。
代码
#include
#include
#include
#defineBLOCK_MAX_SIZE20//最?
大洙?
物?
理え?
块é大洙?
小?
enum{FIFO=1,LRU,OPT};
structnode_page{
intaddress;//指?
令?
地?
址·
intpage_num;//页?
面?
号?
intnext_order;//下?
一?
次?
访?
问ê的?
次?
序ò
}*page;
//物?
理え?
块é定¨义?
typedefstructBlockNode{
intpage_index;//page数簓组哩?
的?
下?
标括?
structBlockNode*next;
}BlockNode;
struct{
intlength;//当獭?
前°物?
理え?
块é长¤度è
intmiss_flag;//缺ā?
页?
标括?
志?
,?
若?
为a1,?
则ò缺ā?
页?
intmiss_count;//缺ā?
页?
次?
数簓
BlockNode*front;
BlockNode*rear;
}Block;
//本?
程ì序ò中D全?
局?
变?
量?
名?
均ù由?
两?
个?
单蹋?
词洙?
组哩?
成é,?
且ò开a头?
字?
母?
大洙?
写′
intBlockSize=5;//物?
理え?
块é大洙?
小?
intPageCount=200;//页?
面?
总哩?
数簓
intPageSize=1024;//页?
面?
大洙?
小?
intAddrRange=8*1024;//访?
问ê地?
址·范?
围§
intget_num(intdown,intup)//得?
到?
一?
个?
down~up之?
间?
的?
整?
数簓
{
intnum;
charstr[111];
while
(1){
fgets(str,111*sizeof(int),stdin);
num=atoi(str);//把?
字?
符?
串?
中D的?
数簓字?
转羇换?
为a整?
数簓
if(num>=down&&num<=up)
break;
printf("输?
入?
范?
围§有瓺误ó,请?
重?
新?
输?
入?
:
");
}//while
returnnum;
}
voidinit_block()//构1造ì一?
个?
空?
的?
物?
理え?
块é队ó列
{
Block.rear=Block.front=(BlockNode*)malloc(sizeof(BlockNode));
if(!
Block.front){
printf("内ú存?
分?
配?
失骸?
败悒?
\n");
exit(0);
}
Block.length=0;
Block.miss_count=0;
Block.rear->next=NULL;
}
voidenqueue(intpage_index)//入?
队ó
{
BlockNode*node=(BlockNode*)malloc(sizeof(BlockNode));
if(!
node){
printf("内ú存?
分?
配?
失骸?
败悒?
\n");
exit(0);
}
node->page_index=page_index;
node->next=NULL;
Block.length++;
Block.rear->next=node;
Block.rear=node;
}
voiddequeue()//出?
队ó
{
BlockNode*node;
node=Block.front->next;
Block.front->next=node->next;
if(node==Block.rear)
Block.rear=Block.front;
free(node);
Block.length--;
}
voidclear_block()//清?
空?
物?
理え?
块é
{
while(Block.rear=Block.front->next){
Block.front->next=Block.rear->next;
free(Block.rear);
Block.length--;
}
Block.rear=Block.front;
Block.length=0;
Block.miss_count=0;
}
voiddestroy_block()//销ú毁ù物?
理え?
块é
{
while(Block.rear=Block.front){
Block.front=Block.front->next;
free(Block.rear);
}
free(page);
}
voidinit_page()//初?
始?
化ˉ页?
面?
系μ列
{
inti,j;
srand(time(NULL));//用?
当獭?
前°系μ统?
时骸?
间?
来ぁ?
初?
始?
化ˉ随?
机ú种?
子哩?
page=(structnode_page*)malloc(PageCount*sizeof(structnode_page));
for(i=0;i page[i].address=rand()%AddrRange; page[i].page_num=page[i].address/PageSize; } for(i=0;i for(j=i+1;j if(page[i].page_num==page[j].page_num){ page[i].next_order=j; break; }//if }//for if(j==PageCount)//说μ明÷page[i]以? 后ó都? 不? 会á再ù访? 问ê page[i].next_order=PageCount; }//for } voidprint_page()//打洙? 印? 页? 面? 系μ列 { inti; printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("页? 面? 系μ列为a: 阰\n"); for(i=0;i printf("[%-2d,%-4d]",page[i].page_num,page[i].address%PageSize); if((i+1)%5==0){ printf("\n"); }//if } printf("\n"); } voidFIFO_Replace(intpage_index)//FIFO置? 换? { BlockNode*node; if(! Block.length){ enqueue(page_index); Block.miss_flag=0; return; } node=Block.front; while(node=node->next){ if(page[node->page_index].page_num==page[page_index].page_num){ Block.miss_flag=0; return; } } if(Block.length enqueue(page_index); Block.miss_flag=0; return; } dequeue(); enqueue(page_index); Block.miss_flag=1; Block.miss_count++; } voidLRU_Replace(intpage_index)//LRU置? 换? { BlockNode*node,*last_node; if(! Block.length){ enqueue(page_index); Block.miss_flag=0; return; } last_node=node=Block.front; while(node=node->next){ if(page[node->page_index].page_num==page[page_index].page_num){ last_node->next=node->next; Block.length--; if(node==Block.rear) Block.rear=last_node; enqueue(node->page_index); free(node); Block.miss_flag=0; return; } last_node=node; } if(Block.length enqueue(page_index); Block.miss_flag=0; return; } dequeue(); enqueue(page_index); Block.miss_flag=1; Block.miss_count++; } voidOPT_Replace(intpage_index)//OPT置? 换? { BlockNode*node; BlockNode*max_node,*max_node_last; if(! Block.length){ enqueue(page_index); Block.miss_flag=0; return; } node=Block.front; while(node=node->next){ if(page[node->page_index].page_num==page[page_index].page_num){ node->page_index=page_index; Block.miss_flag=0; return; } } if(Block.length enqueue(page_index); Block.miss_flag=0; return; } node=Block.front; max_node=node->next; while(node=node->next){//寻°找òBlock中Dnext_order值μ最? 大洙? 的? 节ú点? if(page[max_node->page_index].next_order max_node=node; } node=Block.front; max_node_last=node; while(node=node->next){//寻°找òBlock中Dnext_order值μ最? 大洙? 的? 节ú点? 的? 上? 一? 个? 节ú点? if(node==max_node) break; max_node_last=node; } max_node_last->next=max_node->next; Block.length--; if(max_node==Block.rear) Block.rear=max_node_last; free(max_node); enqueue(page_index); Block.miss_flag=1; Block.miss_count++; } voidpage_replace(intnum) { inti,j; BlockNode*node; charstr[3][5]={"FIFO","LRU","OPT"}; printf("======================%s=========================\n",str[num-1]); printf("页? 面? 号? *"); for(i=0;i printf(""); printf("*是? 否? 缺ā? 页? *\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); for(i=0;i printf("%-4d*",page[i].page_num); if(num==FIFO) FIFO_Replace(i); elseif(num==LRU) LRU_Replace(i); elseif(num==OPT) OPT_Replace(i); node=Block.front; while(node=node->next) printf("%-2d",page[node->page_index].page_num); for(j=Block.length;j printf(""); printf("*%s*\n\n",(Block.miss_flag==1? "Yes": "No")); } printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("缺ā? 页? 数簓: %d,缺ā? 页? 率ê: %%%.2f\n\n",Block.miss_count,(float)Block.miss_count/PageCount*100); printf("按恪? 回? 车μ键ü继ì续? ! \n\n"); getchar(); } voidconfige()//程ì序ò设Θ? 置? { intnum; while (1){ printf("\n***************************************************\n"); printf("*程ì序ò设Θ? 置? *\n"); printf("***************************************************\n"); printf("*1,设Θ? 置? 物? 理え? 块é大洙? 小? (默? 认? 5)*\n"); printf("*2,设Θ? 置? 访? 问ê地? 址·范? 围§(默? 认? 8K)*\n"); printf("*3,设Θ? 置? 页? 面? 大洙? 小? (默? 认? 1K)*\n"); printf("*4,设Θ? 置? 页? 面? 总哩? 数簓(默? 认? 200)*\n"); printf("*5,显? 示? 各÷项? 设Θ? 置? 值μ*\n"); printf("*6,返う? 回? *\n"); printf("***************************************************\n"); printf("请? 输? 入? 您ú的? 选? 择? : "); num=get_num(1,6); if(num==6) break; if(num==1){ printf("请? 输? 入? 物? 理え? 块é大洙? 小? (1~%d): ",BLOCK_MAX_SIZE); BlockSize=get_num(1,BLOCK_MAX_SIZE); printf("设Θ? 置? 成é功|! \n\n"); }//if elseif(num==2){ printf("请? 输? 入? 访? 问ê地? 址·范? 围§(1~%d)K: ",999); AddrRange=get_num(1,999)*1024; printf("设Θ? 置? 成é功|! \n\n"); }//elseif elseif(num==3){ printf("请? 输? 入? 页? 面? 大洙? 小? (1~%d)K: ",AddrRange/1024); PageSize=get_num(1,AddrRange/1024)*1024; printf("设Θ? 置? 成é功|! \n\n"); }//elseif elseif(num==4){ printf("请? 输? 入? 页? 面? 总哩? 数簓(1~%d): ",32767); PageCount=get_num(1,32767); printf("设Θ? 置? 成é功|! \n\n"); }//elseif elseif(num==5){ printf("---------------------------------------------------\n"); printf("*当獭? 前°物? 理え? 块é大洙? 小? : %d\n",BlockSize); printf("*当獭? 前°访? 问ê地? 址·范? 围§: %dK\n",AddrRange/1024); printf("*当獭? 前°页? 面? 大洙? 小? : %dK\n",PageSize/1024); printf("*当獭? 前°页? 面? 总哩? 数簓%d\n",PageCount); printf("---------------------------------------------------\n"); } } free(page); init_page(); } voidbegin() { intnum; print_page(); while (1){ printf("\n***************************************************\n"); printf("*页? 面? 置? 换? 算? 法ぁ? *\n"); printf("***************************************************\n"); printf("*1,先è进? 先è出? 置? 换? 算? 法ぁ? FIFO)*\n"); printf("*2,最? 近ü最? 久? 未′使? 用? 置? 换? 算? 法ぁ? LRU)*\n"); printf("*3,最? 佳? 置? 换? 算? 法ぁ? OPT)*\n"); printf("*4,返う? 回? *\n"); printf("***************************************************\n"); printf("请? 输? 入? 您ú的? 选? 择? : "); num=get_num(1,4); if(num==4) break; page_replace(num); clear_block(); } free(page); init_page(); } intmain() { intnum; init_block(); init_page(); while (1){ printf("\n***************************************************\n"); printf("*存? 储洹? 器÷管ü理え? 模£拟a系μ统? *\n"); printf("***************************************************\n"); printf("*1,进? 入? 页? 面? 置? 换? 算? 法ぁ? *\n"); printf("*2,进? 入? 程ì序ò设Θ? 置? *\n"); printf("*3,退? 出? *\n"); printf("***************************************************\n"); printf("请? 输? 入? 您ú的? 选? 择? : "); num=get_num(1,3); if(num==3) break; if(num==1) begin(); elseif(num==2) confige(); } destroy_block(); re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 材料 页面 置换 算法 模拟