操作系统课设.docx
《操作系统课设.docx》由会员分享,可在线阅读,更多相关《操作系统课设.docx(38页珍藏版)》请在冰点文库上搜索。
操作系统课设
目录
一、课程设计目的1
二、课程设计的内容1
三、系统需求分析1
1、模块划分1
2、模块调用关系图7
3、模块盒图表示7
四、程序源代码12
五、程序测试数据和结果15
六、总结17
1、设计体会17
2、心得体会18
七、程序设计说明书19
附件23
一、课程设计目的
本课程设计是学生学习完《操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
2、课程设计内容
题目:
设计一个虚拟存储区和内存工作区,编程序演示下述算法的具体实现过程,并计算访问命中率。
设计要求:
主界面以灵活选择某算法,且以下算法都要实现
1、先进先出算法(FIFO)
2、最近最久未使用算法(LRU)
3、最佳置换算法(OPT)
3、设计方案介绍
1、模块划分
(1)内存赋值的函数
voidmemory1(intmsize,char*a)
{inti;
for(i=0;ia[i]='0';//把memory数组中的值赋为0
}
说明:
该函数实现了内存赋值的功能,在这个题目中这个函数实现了内存中值赋为0。
(2)先进先出算法
voidFIFO(intmsize,intqsize)
{intflag[100]={0};//用来记录内存中数据时间先后,数越大数据内存表示进入时间越长
inti=0,j=0;//i表示随机队列的下标;j表示内存队列的下标
intm=-1;//m用来记录内存空闲的物理块;
intn=-1;//n用来记录内存与队列进程相同的内存下标
intmax=-1;//max记录队列中进入内存时间最长的下标;
maxtime=0;//maxtime记录flag[]中数据进入内存时间最长的
intcount=0;//count表示命中的次数
for(i=0;i{for(j=0;j{if(memory[j]=='0'){m=j;break;}
}
for(j=0;j{if(memory[j]==queue[i])
{n=j;count++;}
}
for(j=0;j{if(flag[j]>maxtime)
{maxtime=flag[j];max=j;}
}
if(n==-1)//不存在相同进程
{if(m!
=-1)//存在空闲的内存物理块
{memory[m]=queue[i];//空闲的内存物理块赋值
flag[m]=0;//赋值的内存物理块的时间块赋值为0
for(j=0;j<=m;j++)
{flag[j]++;//把空闲的内存物理块前面的时间块的值加1}
m=-1;//空闲的物理的标志去除
}
else//不存在空闲物理块
{memory[max]=queue[i];//把queue[i]中的值赋给最早进入内存的值
flag[max]=0;//把最早进入内存的时间调度的值赋为0
for(j=0;j{flag[j]++;//把内存中时间调度的值都加1.}
max=-1;//把内存中进入时间最长的下标的标志去掉
maxtime=0;//把时间最长的标志去掉
}
}
else//存在相同的进程
{for(j=0;j{flag[j]++;}
n=-1;//把存在相同进程的标志去掉
}
for(j=0;j{cout<cout<}
cout<<"页面命中的次数为:
"<cout<<"页面的命中率为:
"<}
说明:
FIFO()函数实现的是先进先出算法,根据随机生成的页面标号完成先进先出算法的调度,并计算出命中率。
(3)最近最久未使用算法
voidLRU(intmsize,intqsize)
{
intflag[100]={0};//记录内存中最近最久未使用的时间长度
inti=0,j=0;//i用来记录队列的下表;j用来记录内存的下标
intm=-1,n=-1;//m记录内存中空闲物理块的下标;n记录内存中与进程相同的数的下表
intmax=-1,maxflag=0;//max记录flag[]中最大的数的下标;maxflag记录flag[]中最大的数
intcount=0;//命中的次数
for(i=0;i{for(j=0;j{if(memory[j]=='0')
{m=j;break;}
}
for(j=0;j{if(memory[j]==queue[i]){n=j;}
}
for(j=0;j{if(flag[j]>maxflag){maxflag=flag[j];max=j;}
}
if(n==-1)//不存在相同进程
{if(m!
=-1)//存在空闲物理块
{memory[m]=queue[i];//空闲的内存物理块赋值
flag[m]=1;//赋值的内存物理块的时间块赋值为1
for(j=0;j{flag[j]++;//把flag[m]中的数加1}
m=-1;//空闲的物理的标志去除
}
else//不存在空闲物理块
{memory[max]=queue[i];//把queue[i]中的值赋给最早进入内存的值
flag[max]=0;//把最早进入内存的时间调度的值赋为0
for(j=0;j{flag[j]++;//把内存中时间调度的值都加1}
max=-1;//把内存中进入时间最长的下标的标志去掉
maxflag=0;//把时间最长的标志去掉
}
}
else//存在相同的进程
{count++;//命中自增
flag[n]=0;
if(m!
=-1)//若存在空闲物理块
{flag[m]=0;}
for(j=0;jmax=-1;
maxflag=0;
n=-1;
}
for(j=0;j{cout<}
printf("页面命中次数为:
%d\n",count);cout<cout<<"页面的命中率为:
"<}
说明:
LRU()函数实现的是最近最久未使用算法的功能,根据生成的随机数列完成最近最久未使用算法对他们的调度,并计算出命中率。
(4)最佳置换算法
voidOPT(intmsize,intqsize)
{intflag[100]={0};//用来记录内存中数据时间先后,数越大数据内存表示进入时间越长
inti=0,j=0;//i表示随机队列的下标;j表示内存队列的下标
intm=-1,n=-1;//m记录内存空闲的物理块,n用来记录内存与队列进程相同的内存下标
intmax=-1;//max记录队列中进入内存时间最长的下标;
maxtime=0;//maxtime记录flag[]中数据进入内存时间最长的
intcount=0;//count表示命中的次数
inta=0,b;
for(i=0;i{for(j=0;j{if(memory[j]=='0'){m=j;break;}
}
for(j=0;j{if(memory[j]==queue[i]){n=j;count++;//命中,count加1}
}
for(j=0;j{if(flag[j]>maxtime){maxtime=flag[j];max=j;}
}
if(n==-1)//不存在相同进程
{if(m!
=-1)//存在空闲的内存物理块
{memory[m]=queue[i];//空闲的内存物理块赋值
for(b=i+1;b{if(memory[m]==queue[b]){a=b;break;}
}
if(a==0)flag[m]=100000;
elseflag[m]=a;//把flag[m]的值赋为a
m=-1;//空闲的物理的标志去除
}
else//不存在空闲物理块
{memory[max]=queue[i];//把queue[i]中的值赋给最早进入内存的值
for(b=i+1;b{if(memory[max]==queue[b]){a=b;break;}}
if(a==0)flag[max]=100000;
elseflag[max]=a;
}
}
else//存在相同的进程
{memory[n]=queue[i];
for(b=i+1;b{if(memory[n]==queue[b]){a=b;break;}
}
if(a==0)flag[n]=100000;
elseflag[n]=a;
n=-1;//把存在相同进程的标志去掉
}
for(j=0;j{cout<}
cout<<"页面命中的次数为"<cout<<"页面的命中率为:
"<}
说明:
OPT()函数实现的是最佳置换算法的功能,根据随机生成的数列来实现对他们的调度并计算出命中率。
(5)主函数
voidmain()
{cout<cout<<"×××××××××××********欢迎使用本系统********×××××××××××××"<inta,b,c,k;//a表示是否对数据进行修改;b对应内存的数据;c对应队列的长度,,
chard,e;//d表示是否对队列进行修改,e表示对算法的选择
intmsize=3,f;//内存中的长度,f表示对循环使用的标志
intqsize=8;//队列的长度
L:
printf("对队列进行赋值,1:
随机产生一个队列;2:
手动输入一个队列:
");
cin>>d;cout<if(d!
='1'&&d!
='2')
{cout<<"输出的选项错误,请重新输入!
"<switch(d)
{case'1':
//随机产生的数组
{cout<<"随机产生队列为:
";
for(inti=0;i<8;i++)cout<cout<}break;
case'2':
//手动产生的数组
{inti;
printf("默认长度内存为3,队列为8,你是否想对其长度进行修改(0:
N;1:
Y):
");
cin>>a;cout<if(a==1)
{printf("请依次输入内存、队列的长度:
");cin>>b>>c;
msize=b;
qsize=c;
}
printf("请输入你想要的队列:
");cin>>queue;
for(i=0;i{charm;
m=queue[i];
if(m<'0'||m>'9')
{cout<<"第"<
";cin>>queue[i];}
}
for(i=0;icout<}
}
K:
cout<<"请输入您想选择的算法:
"<for(inti=0;i<8;i++)cout<<"*********";cout<cout<<"1:
先进先出算法;2:
最近最久未使用算法;3:
最佳置换算法;
4:
以上三种算法都有"<for(intj=0;j<8;j++)cout<<"*********";cout<cin>>e;cout<if(e!
='1'&&e!
='2'&&e!
='3'&&e!
='4')
{cout<<"输入的算法错误,请重新输入!
"<switch(e)
{case'1':
memory1(msize,memory);//对memory数组进行赋值,消除以前的记忆
cout<<"先进先出(FIFO)页面置换算法"<case'2':
memory1(msize,memory);
cout<<"最近最久未使用算法如下:
"<case'3':
memory1(msize,memory);
cout<<"最佳置换算法如下:
"<case'4':
memory1(msize,memory);
cout<<"先进先出(FIFO)页面置换算法"<memory1(msize,memory);
cout<<"最近最久未使用算法如下:
"<memory1(msize,memory);
cout<<"最佳置换算法如下:
"<}
cout<<"是否对出系统(0:
N;1:
Y)?
";cin>>f;cout<if(f==0)
{cout<<"是否想创建新的队列(0:
N;1:
Y)?
";cin>>k;cout<if(k==1)gotoL;
if(k==0)gotoK;
}cout<cout<<"××××××××××********退出本系统,谢谢使用********××××××××××××"<}
说明:
主函数main()实现了对界面自动和的设计和对各个算法的调用
2、模块调用关系图
Main()函数
OPT()函数
LRU()函数
FIFO()函数
Memory1函数
3、模块盒图表示
(1)voidmemory1(intmsize,char*a)函数模块
Inti=0;
for(i=0;ia[i]='0'
(2)voidFIFO(intmsize,intqsize)函数模块
intflag[100]={0}inti=0,j=0;;intm=-1,n=-1;
intmax=-1,maxtime=0;intcount1=0;
for(i=0;ifor(j=0;jFif(memory[j]=='0'T
-----m=j;break;
for(j=0;jFif(memory[j]==queue[i])T
---------n=j;count++;
for(j=0;jFif(flag[j]>maxtime)T
---------maxtime=flag[j];max=j;
Fif(n==-1)T
for(j=0;j=-1)
FT
flag[j]++;memory[max]=queue[i];memory[m]=queue[i]
flag[max]=0;flag[m]=0;
for(j=0;jflag[j]++;flag[j]++;
n=-1;
max=-1;m=-1;
maxtime=0;
for(j=0;jcout<cout<cout<<"页面命中的次数为:
"<cout<<"页面的命中率为:
"<
(3)LRU()函数模块
(3)voidLRU(intmsize,intqsize)函数模块
intflag[100]={0};inti=0,j=0;intm=-1,n=-1;
intmax=-1,maxtime=0;intcount=0;
for(i=0;ifor(j=0;jFif(memory[j]=='0')T
---------m=j;break;
for(j=0;jif(memory[j]==queue[i])
FT
-------n=j;count++;
for(j=0;jFif(flag[j]>maxtime)T
--------maxtime=flag[j];max=j;
Fif(n==-1)T
if(m!
=-1)if(m!
=-1)
FTFT
-------flag[m]=0;memory[max]=queue[i];memory[m]=queue[i]
flag[max]=0;flag[m]=1;
for(j=0;jflag[j]++;flag[j]++;flag[j]++;
max=-1;
maxflag=0;max=-1;
n=-1;maxtime=0;m=-1;
for(j=0;jcout<cout<printf("页面命中次数为:
%d\n",count);
cout<cout<<"页面的命中率为:
"<(4)OPT(intmsize,intqsize)函数模块
intflag[100]={0};inti=0,j=0;intm=-1,n=-1;
intmax=-1,maxtime=0;intcount=0;inta=0,b;
for(i=0;ifor(j=0;jFif(memory[j]=='0')T
-------------m=j;break;
for(j=0;jFif(memory[j]==queue[i])T
---------------n=j;count++;
for(j=0;jFf(flag[j]>maxtime)T
maxtime=flag[j];
-------max=j;
Fif(n==-1)T
memory[n]=queue[i];Fif(m!
=-1)T
for(b=i+1;bif(memory[n]for(b=i+1;bF==queue[b])Tif(memory[max]if(memory[m]
F==queue[b])TF==queue[b])T
------a=b;break;------a=b;break;-----a=b;break;
a==0
FTFa==0TFif(a==0)T
flag[m]
flag[n]=a;flag[n]=100000;fflag[max]flag[m]=a;=100000;
n=-1;lag[max]=a=10000