操作系统课设.docx
- 文档编号:10586782
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:38
- 大小:219.49KB
操作系统课设.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;i a[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;j max=-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;i cout< } } 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;i a[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;i for(j=0;j Fif(memory[j]=='0'T -----m=j;break; for(j=0;j Fif(memory[j]==queue[i])T ---------n=j;count++; for(j=0;j Fif(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;j flag[j]++;flag[j]++; n=-1; max=-1;m=-1; maxtime=0; for(j=0;j cout< 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;i for(j=0;j Fif(memory[j]=='0')T ---------m=j;break; for(j=0;j if(memory[j]==queue[i]) FT -------n=j;count++; for(j=0;j Fif(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;j flag[j]++;flag[j]++;flag[j]++; max=-1; maxflag=0;max=-1; n=-1;maxtime=0;m=-1; for(j=0;j cout< 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;i for(j=0;j Fif(memory[j]=='0')T -------------m=j;break; for(j=0;j Fif(memory[j]==queue[i])T ---------------n=j;count++; for(j=0;j Ff(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;b if(memory[n]for(b=i+1;b F==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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统