操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
中北大学
操作系统课程设计
说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
吕国宏
学号:
0921010830
设计题目:
基于Linux的模拟存储器管理的设计与
实现
起迄日期:
2011年12月22日-2012年1月5日
指导教师:
康珺
2012年1月5日
1需求分析
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
1、在内存开辟两块存储空间,分别模拟内存和外存,大小分别是8M,25M。
2、给定三个文件A,B,C,大小分别是4.2M,8M和9.8M。
模拟其并发执行过程。
3、每个进程在内存中固定分配4个页面,缺页时分别采用四种置换算法(FIFO,LRU,NUR,OPT)进行置换。
4、假定页面大小为512K,进程执行时页面调度顺序要求手动输入。
要求:
要求在屏幕上输出各进程页面置换过程(以图表形式描述)以及每种页面置换算法的缺页率和置换率,并对比各算法的优劣。
2总体设计
在进程运行过程中,若其所要访问的页面不在内存而需把它们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据,送磁盘的对换区中。
但应将哪个页面调出,须根据一定的算法来确定。
一个好的页面置换算法,应具有较低的页面更换频率。
从理论上讲,应将那些以后不再会访问的页面换出,或将那些在较长时间内不会再访问的页面调出。
本程序是在linux环境下进行调试,采用C语言进行设计,模拟三个进程执行时系统内存页面的四种置换算法:
FIFO(先进先出置换算法),OPT(最佳置换算法),LRU(最近最久未使用算法),NUR(最近最少使用算法)。
先建立全局变量num[]存入内存中程序访问序列,建立block结构体模拟内存物理块,对访问的页面序列,先检测block中是否存在要访问的页面,若不存在则检测内存是否有空闲的物理块,若有则直接将要访问的页面加入block,若不存在则根据选择不同的算法进行页面置换,依次进行遍历num[],直至结束。
3.详细设计
程序源代码:
#include
#include
#definepagesize4//页面尺寸大小//物理块数
typedefstructBLOCK//声明一种新类型--物理块类型
{
intpagenum;//页号
intaccessed;//访问量,其值表示多久未被访问
}BLOCK;
intpc;//程序计数器,用来记录对应的页号
intn;//缺页计数器,用来记录缺页的次数
staticintnum[10];//用来存储320条随机数
BLOCKblock[pagesize];//定义一大小为8的物理块数组
voidinit();//程序初始化函数
intfindExist(intcurpage);//查找物理块中是否有该页面
intfindSpace();//查找是否有空闲物理块
intfindReplace();//查找应予置换的页面
voiddisplay();//显示
voidpagestring();//显示调用的页面队列
voidOPT();
voidLRU();
voidFIFO();
voidinput();
voidNUR();
intmain()
{
intselect;
//printf("请输入第一个随机数(0~320):
");
//randam();
input();
//printf("*****对应的调用页面队列*******\n");
pagestring();
do
{
printf("****************************************\n");
printf("------1:
OPT(吕国宏)-----\n");
printf("------2:
LRU(段子彧)-----\n");
printf("------3:
FIFO(卜一川)-----\n");
printf("------4:
NUR(雷旭东)-----\n");
printf("****************************************\n");
printf("请选择一种页面置换算法:
");
scanf("%d",&select);
printf("****************************************\n");
init();
switch(select)
{
case1:
printf("最佳置换算法OPT:
\n");
printf("*****************\n");
OPT();
break;
case2:
printf("最近最久未使用置换算法LRU:
\n");
printf("*************************\n");
LRU();
break;
case3:
printf("先进先出置换算法FIFO:
\n");
printf("*********************\n");
FIFO();
break;
case4:
printf("最近最少使用算法NUR:
\n");
printf("**********************\n");
NUR();
break;
}
}while(select!
=5);
return0;
}
voidinit()
{
inti;
for(i=0;i{
block[i].pagenum=-1;
block[i].accessed=10;
pc=n=0;
}
}
intfindExist(intcurpage)
{
inti;
for(i=0;i{
if(block[i].pagenum==curpage)
returni;//检测到内存中有该页面,返回block中的位置
}
return-1;
}
intfindSpace()
{
inti;
for(i=0;i{
if(block[i].pagenum==-1)
returni;//找到空闲的block,返回block中的位置
}
return-1;
}
intfindReplace()
{
intpos=0;
inti;
for(i=0;i{
if(block[i].accessed>block[pos].accessed)
pos=i;//找到应该置换页面,返回BLOCK中位置
}
returnpos;
}
voiddisplay()
{
inti;
for(i=0;i{
if(block[i].pagenum!
=-1)
{
printf("%2d",block[i].pagenum);
}
}
printf("\n");
}
voidinput()//输入访问序列
{
inti;
printf("请输入访问序列(可以输入10个,用空格隔开!
):
\n");
for(i=0;i<10;i++)
{
scanf("%d",&num[i]);
}
}
voidpagestring()//显示调用的页面队列,页面号取法为随机数除10取整
{
inti;
printf("您刚才输入的调度队列(取前10个):
\n");
for(i=0;i<10;i++)
{
printf("%2d",num[i]);
}
printf("\n");
}
voidNUR()//最近最少使用算法
{
intexist,space,position;
intcurpage,i,k,j;
for(i=0;i<10;i++)
{
pc=num[i];
curpage=pc;
exist=findExist(curpage);
if(exist==-1)
{
space=findSpace();
if(space!
=-1)//当内存中有空闲物理块时
{
block[space].pagenum=curpage;
display();
n=n+1;
}
else
{
for(k=0;k{
for(j=i;j<10;j++)
{
if(block[k].pagenum!
=num[j])//当前块号不等于预备队列的块号
{
block[k].accessed++;//将来不会用,设置为一个很大数
}
else
{
//block[k].accessed=j;//将当前块号访问量赋上预备队列的序号
block[k].accessed--;//越小说明访问次数越多
//break;
}
}
}
position=findReplace();
block[position].pagenum=curpage;
display();
n++;
}
}
}
printf("缺页次数:
%d\n",n);
printf("缺页率:
%f%%\n",(n/10.0)*100);
}
程序运行结果:
4.心得体会
通过这次课程设计我更加了解了系统中存储管理器页面置换算法的原理,对存储器管理有了更加深刻的理解,更加了解什么是缺页中断,同时,也更加熟悉了在linux环境下程序的调试,也对linux操作系统有了新的认识;这次我们一组四个人在一起相互交流,不仅增进了友情,而且都各自增长了不少见识。