请求调页存储器管理方式的模拟.docx
《请求调页存储器管理方式的模拟.docx》由会员分享,可在线阅读,更多相关《请求调页存储器管理方式的模拟.docx(19页珍藏版)》请在冰豆网上搜索。

请求调页存储器管理方式的模拟
课程设计
课程设计名称:
计算机操作系统课程设计
专业班级:
计算机科学与技术班
学生姓名:
学号:
指导教师:
课程设计时间:
2010.12.20~2010.12.24
计算机科学与技术专业课程设计任务书
学生姓名
专业班级
学号
题目
请求调页存储管理方式的模拟2
课题性质
其它
课题来源
自拟课题
指导教师
同组姓名
主要内容
1)假设每个页面中可存放10条指令,分配给作业的内存块数为4。
2)用C语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。
在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。
如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。
如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。
在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
3)置换算法:
最近最久未使用(LRU)算法。
任务要求
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。
参考文献
任满杰等《操作系统原理实用教程》电子工业出版社2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
罗宇等《操作系统课程设计》机械工业出版社2005
审查意见
指导教师签字:
教研室主任签字:
年月日
一需求分析
请求调页存储管理方式的模拟是基于LRU算法的设计而设计的,通过学习计算机操作系统中的请求调页存储管理方式的几种算法,我选择了最近最久未使用算法即LRU算法实现请求调叶存储管理,通过具体的程序来模仿LRU的工作机制。
二概要设计
1.数据结构
依据给定的数据信息,数组必须以结构体实现,结构类型的层次结构如下:
typedefstructBLOCK//声明一种新类型——物理块类型
{
intpagenum;//页号
intaccessed;//访问字段,其值表示多久未被访问
}BLOCK;
2.函数原型清单:
Voidmain();//主函数
voidinit(intBsize);//程序初始化函数
intfindExist(intcurpage);//查找物理块中是否有该页面
intfindSpace(intBsize);//查找是否有空闲物理块
intfindReplace();//查找应予置换的页面
voiddisplay(intBsize);//显示
voidsuijishu(intr);//产生320条随机数,显示并存储到temp[320]
voidpagestring();//显示调用的页面队列
voidLRU(intBsize);//LRU算法
3.全局变量:
intBsize;
intpc;//程序计数器,用来记录指令的序号
intn;//缺页计数器,用来记录缺页的次数
staticinttemp[320];//用来存储320条随机数
BLOCKblock[Bsize];//定义一大小为4的物理块数组
三运行环境(软硬件环境)
硬件:
CPU,主板,内存,显示器,硬盘,显卡,键盘等等.
软件:
WINDOWSXP,Visualc++应用软件.
四开发工具和编程语言
开发工具:
Visualc++
编程语言:
c语言
五详细设计
#include
#include
#include
#include
typedefstructBLOCK//声明一种新类型——物理块类型
{
intpagenum;//页号
intaccessed;//访问字段,其值表示多久未被访问
}BLOCK;
intBsize;
BLOCKblock[32];//模拟内存块
intpc;//程序计数器,用来记录指令的序号
intn;//缺页计数器,用来记录缺页的次数
staticinttemp[320];//用来存储320条随机数
//*************************************************************
voidinit(intBsize);//程序初始化函数
intfindExist(intcurpage);//查找物理块中是否有该页面
intfindSpace(intBsize);//查找是否有空闲物理块
intfindReplace();//查找应予置换的页面
voiddisplay(intBsize);//显示
voidsuijishu(intr);//产生320条随机数,显示并存储到temp[320]
voidpagestring();//显示调用的页面队列
voidLRU(intBsize);//LRU算法
//*************************************************************
voidinit(intBsize)
{
inti;
for(i=0;i{
block[i].pagenum=-1;
block[i].accessed=0;
pc=n=0;
}
}
//-------------------------------------------------------------
intfindExist(intcurpage,intBsize)
{
inti;
for(i=0;i{
if(block[i].pagenum==curpage)
returni;//检测到内存中有该页面,返回block中的位置
}
return-1;
}
//-------------------------------------------------------------
intfindSpace(intBsize)
{
inti;
for(i=0;i{
if(block[i].pagenum==-1)
returni;//找到空闲的block,返回block中的位置
}
return-1;
}
//-------------------------------------------------------------
intfindReplace(intBsize)
{
inti,pos=0;
for(i=0;i{
if(block[i].accessed>block[pos].accessed)
pos=i;//找到应予置换页面,返回BLOCK中位置
}
returnpos;
}
//-------------------------------------------------------------
voiddisplay(intBsize)
{
if(Bsize==4)
{
inti;
for(i=0;i{
if(block[i].pagenum!
=-1)
{printf("%02d",block[i].pagenum);
}
}
printf("\n");
}
}
//-------------------------------------------------------------
voidsuijishu(intr)
{
inti,flag=0;
pc=r;
printf("****按照要求产生的320个随机数:
*******\n");
for(i=0;i<320;i++)
{
temp[i]=pc;
if(flag%2==0)pc=++pc%320;
if(flag==1)pc=rand()%(pc-1);
if(flag==3)pc=pc+1+(rand()%(320-(pc+1)));
flag=++flag%4;
printf("%03d",temp[i]);
if((i+1)%10==0)printf("\n");
}
}
//-------------------------------------------------------------
voidpagestring()
{
inti;
for(i=0;i<320;i++)
{
printf("%02d",temp[i]/10);
if((i+1)%10==0)printf("\n");
}
}
//-------------------------------------------------------------
voidLRU(intBsize)
{
intexist,space,position;
inti,j,curpage;
init(Bsize);
for(i=0;i<320;i++)
{
pc=temp[i];
curpage=pc/10;
exist=findExist(curpage,Bsize);
if(exist==-1)
{
space=findSpace(Bsize);
if(space!
=-1)
{
block[space].pagenum=curpage;
display(Bsize);
n=n+1;
}
else
{
position=findReplace(Bsize);
block[position].pagenum=curpage;
display(Bsize);
n++;
}
}
elseblock[exist].accessed=-1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1
for(j=0;j<4;j++)
{block[j].accessed++;}
}
if(Bsize==4)
printf("(LRU)算法在不同内存容量下的命中率为\n");
printf("内存容量为%d",Bsize);
printf("的缺页次数:
%d",n);
printf("缺页率:
%f",(n/320.0)*100);
printf("%%");
printf("命中率:
%f",(1-n/320.0)*100);
printf("%%");
printf("\n");
}
//-------------------------------------------------------------
//*************************************************************
voidmain()
{
intt,i,j=1,select;
printf("请输入第1条指令号(0~320):
");
scanf("%d",&i);
while(i>320||i<0)
{
printf("你输入有误,请重新输入!
\n");
printf("请输入第1条指令号(0~320):
");
scanf("%d",&i);
}
while(i>=0&&i<=320)
{
suijishu(i);
printf("*****对应的调用页面队列*******\n");
pagestring();
printf("******************************\n");
init(i);
printf("最近最久未使用置换算法LRU:
\n");
printf("******************************\n");
for(t=4;t<=32;t++)
LRU(t);
j=j+1;
printf("请输入第%d条指令号(0~320)[输入-1结束]:
",j);
scanf("%d",&i);
}
}
六调试分析
(1).刚开始进行编译时,出现了86个错误和警告,吓了自己一跳,于是就静下心来一点一点分析程序,发现自己竟然那么粗心,不是少了括号就是少了分号,还有一些语法错误,经过慢慢的修改,程序最终顺利运行出来.
(2).在调试过程中,有时会显示没有错误和警告,但程序会无法执行,或执行到中间就无法在执行了,于是我就用F10进行调试,发现可能出错的子函数,然后进行仔细分析改正,调试成功.
七测试结果
图1输入错误数字的提示信息
图2随机产生的320个数
图3对应的调用页面的队列
图4LRU算法
(1)
图5LRU算法
(2)
图6LRU算法(3)
图7LRU算法(4)
图8LRU算法(5)和计算最近最少使用(LRU)算法在不同内存容量下的命中率
八参考文献
[1]谭浩强《C程序设计》第三版北京清华大学出版社
[2]丁华伟《C语言程序设计系统》第三版北京清华大学出版社
[3]严蔚敏《数据结构》C语言版北京清华大学出版社
课程设计总结
本程序能通过输入第一条指令号(用3位整数代表指令号),产生320个随机数,并以每行10个显示出来。
再把这320个随机数转换成对应的页面号,并以每行10个显示出来。
然后,通过输入选择键,分别执行三个置换算法。
各个置换算法能显示页面置换的情况,缺页次数,和缺页率。
基本实现了对请求调页存储器管理方式的模拟。
本程序的另一个亮点是使用getch()使程序的执行过程能够暂停。
本程序的不足之处是未实现地址转换功能的显示,自我感觉程序不够精练,可读性不高,还要进一步改进。
由于时间问题,只能留待课程结束后修改。