南昌大学计算机操作系统实验报告.doc

上传人:PIYPING 文档编号:10969667 上传时间:2021-06-14 格式:DOC 页数:32 大小:1.02MB
返回 下载 相关 举报
南昌大学计算机操作系统实验报告.doc_第1页
第1页 / 共32页
南昌大学计算机操作系统实验报告.doc_第2页
第2页 / 共32页
南昌大学计算机操作系统实验报告.doc_第3页
第3页 / 共32页
南昌大学计算机操作系统实验报告.doc_第4页
第4页 / 共32页
南昌大学计算机操作系统实验报告.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《南昌大学计算机操作系统实验报告.doc》由会员分享,可在线阅读,更多相关《南昌大学计算机操作系统实验报告.doc(32页珍藏版)》请在三一文库上搜索。

1、实 验 报 告实验课程: 计算机操作系统 学生姓名: 学 号: 专业班级: 2012年12月 19日 目 录实验一 编程实现银行家安全算法实验二 进程调度算法的实现实验三 存储管理的模拟实现 一、实验目的通过实验加强对银行家安全算法的理解和掌握。二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤设计说明:假定系统中有五个进程P0,P1,P2,P3,P4和三类资源的数量分别为10、5、7,在T0时刻的资源分配情况如下图示: 资源情况进程MaxA B CAlloc

2、ationA B CNeedA B CAvailableA B CP07 5 30 1 07 4 3 3 3 2P1 3 2 2 2 0 01 2 2P29 0 2 3 0 2 6 0 0P3 2 2 2 2 1 1 0 1 1P4 4 3 3 0 0 2 4 3 1假设在此后任一时刻有一个进程P发出请求向量request,通过发出的向量判断是否可以满足需要,如果可以,则假设将该资源予以分配,并通过安全性算法进行检测,如果安全,则找出安全序列,否则系统不安全,将分配的资源回收。代码设计:将5个进程的所有信息放在一个对应的结构体struct pro【i】中,系统资源数和进程请求资源分别存放在av

3、ailable和request数组中,同时通过建立一个finishi布尔数组来控制和标识5个进程的完成情况,如果最后finish值都为真,则说明分配资源后系统是安全的,否则,不安全并将资源回收。银行家算法实现代码:#include #include int main(void)struct processint max3; int allocation3; int need3;pro5=7,5,3,0,1,0,7,4,3,3,2,2,2,0,0,1,2,2,9,0,2,3,0,2,6,0,0,2,2,2,2,1,1,0,1,1,4,3,3,0,0,2,4,3,1;int available3=

4、3,3,2,request3;int work3,finish5=0;int m,i,j,k,count=0,number=0;int r=0,rank5=0;printf(t2*银行家算法*2n);printf(The information of processes and system:n);printf(tnamet maxtallocationt needtavailablen);for(i=0;i5;i+)printf(t);printf(P%d,i);printf(t);for(j=0;j3;j+)printf(%2d,proi.maxj);printf(t);for(j=0;j

5、3;j+)printf(%2d,proi.allocationj);printf(tt);for(j=0;j3;j+)printf(%2d,proi.needj);printf(t);if(i=0)for(j=0;j3;j+)printf(%2d,availablej);printf(n);printf(please choose the process number:);scanf(%d,&m);printf(please input the request :);for(i=0;i3;i+)scanf(%d,&requesti);for(j=0;j3;j+)if(requestj = pr

6、om.needj)count+;if(count = 3)for(i=0;i3;i+)if(requesti = availablei)number+;if(number = 3)for(k=0;k3;k+)availablek=availablek-requestk;prom.allocationk=prom.allocationk+requestk;prom.needk=prom.needk-requestk; elseprintf(请求资源不能满足!);exit(0); else printf(请求资源超过所需!); exit(0);for(j=0;j3;j+)workj=availab

7、lej; L: count = 0; for(i=0;i5;i+)if(!finishi)for(j=0;j3;j+)if(proi.needj=workj)count+;if(count = 3)finishi=1;rankr+=i;for(k=0;k3;k+)workk=workk+proi.allocationk;goto L;else count=0; number=0;for(k=0;k5;k+)if(finishk=1)number+;if(number=5)printf(系统处于安全状态!n);printf(安全序列为:n);for(i=0;i5;i+)printf(tP%d,r

8、anki); else printf(系统处于不安全状态!);return 0;运行结果:六、实验体会或对改进实验的建议程序比较长,用到了上学期的c语言编程,感觉主要是count比较难把握,程序算法还是比较清晰,就是自己编一个程序有一定难度,必须多加练习了。做完后对银行家算法有更深的理解。 南昌大学实验报告 -进程调度算法的实现 一、实验目的通过实验加强对进程调度算法的理解和掌握。二、实验内容编写程序实现进程调度算法,具体可以编写程序实现先来先服务算法或优先度高者调度算法。三、实验要求1、 需写出设计说明;2、设计实现代码及说明;3、运行结果四实验主要过程和步骤前三个算法主要是解决进程调度的顺

9、序问题,最后一个时间片轮转调度主要是解决每个进程的完成时间,所以以下算法主要对此进行说明。FCFS进程调度算法设计: 建立一个结构体数组pro100,每个结构体中都存有各进程相关信息,然后输入进程数N确定进程数,并输入各进程的相关信息。通过fcfs算法对按照所输入进程的arrivetime的大小进行排序,排好的序即为进程调度的执行顺序。最后再通过对个进程的其他数据进行简单处理即可。SJF进程调度算法设计: SJF的算法设计基本同上。只是在排序过程中稍有不同,它是按照进程的服务时间servetime来安排进程的调度顺序的。HRF进程调度算法设计:通过建立add值,对进程执行完后时间的累计,用来计

10、算下一个进程的等待时间,add初始值为第一个进程执行后的完成时间。从第二个进程开始进行优先级priority的比较,然后记录下优先级最大的进程的标号k,并与第二进程进行调换,下一次再通过同样的方法找到最大优先级的进程同第三个进程进行调换,依次类推直到执行完所有的进程。其中通过count值控制每次执行的循环次数,l值标明下次所要调换的程序的标号。时间片轮转调度算法:首先,用过一个N次的循环计算每个进程的开始时间starttime,对每个进程首先判断proi-1.servetime是否小于时间片大小size,如果小于size就让proi.starttime等于proi-1.starttime加上p

11、roi-1.servetime,否则的话,就让其加上时间片大小size。下来接着处理完成时间,首先为每个进程建立resttime的数组,用来存放每个进程执行一次的剩余时间,并将每个进程的servetime值对应的赋给它,然后通过用一个while(count!=N)的循环控制所有的进程是否完成,最后在这个循环里面对每个进程检测,看它的resttime是否为0,如果为0说明它已经完成,否则判断他的resttime是否小于等于size,如果小于说明本次就能完成本进程,并将time的值赋给finishtime,否则的话就将resttime值减size,并将time值加size,这样不断地循环执行,知道

12、N个进程全部执行完毕。FCFS进程调度算法实现代码:#include int main(void)struct processchar pro_name10;float arrivetime;float servetime;floatstarttime;floatfinishtime;floatcircle_time;floatd_circle_time;a100;/用结构体存放各进程的相关信息int i,j,k,N;process temp;printf(请输入进程数:);scanf(%d,&N);/进程数printf(请输入进程信息(包括进程名、进程到达时间、进程服务时间): n);for

13、(i=0;iN;i+)printf(请输入第 %d个进程的信息:,i+1);scanf(%s%f%f,&ai.pro_name,&ai.arrivetime,&ai.servetime);for(i=0;iN;i+)for(j=0;j=i;j+)if(ai.arrivetimeaj.arrivetime)temp=ai;ai=aj;aj=temp; / 按照FCFS算法对进程进行排序printf(nFCFS进程调度顺序为:n);for(k=0;kN;k+)printf(%5s,ak.pro_name);printf(n);a0.starttime=a0.arrivetime;a0.finish

14、time=a0.servetime+a0.starttime;a0.circle_time=a0.finishtime-a0.arrivetime;a0.d_circle_time=a0.circle_time/a0.servetime;/计算第一个进程的相关信息for(i=1;iN;i+)ai.starttime=ai-1.servetime+ai-1.starttime;ai.finishtime=ai.servetime+ai.starttime;ai.circle_time=ai.finishtime-ai.arrivetime;ai.d_circle_time=ai.circle_t

15、ime/ai.servetime; /计算其他进程的相关信息printf(n进程调度列表:n);printf(nametarrivetservetstarttfinishtcircletd_circlen);for(i=0;iN;i+)printf(%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,ai.pro_name,ai.arrivetime,ai.servetime,ai.starttime,ai.finishtime,ai.circle_time,ai.d_circle_time);return 0;运行结果;fcfs进程调度运行结果SJF进程调度算法实现代码:#i

16、nclude int main(void)struct processchar pro_name10;float arrivetime;float servetime;floatstarttime;floatfinishtime;floatcircle_time;floatd_circle_time;a100;int i,j,k=0,N;process temp;process t;printf(请输入进程数:);scanf(%d,&N);printf(请输入进程信息(包括进程名、进程到达时间、进程服务时间:n );for(i=0;iN;i+)printf(请输入第 %d个 进程的信息,i+1

17、);scanf(%s%f%f,&ai.pro_name,&ai.arrivetime,&ai.servetime);float min=a0.arrivetime;for(i=0;iN;i+)if(ai.arrivetimemin)min=ai.arrivetime;k=i;printf(n);temp=a0;a0=ak;ak=temp;for(i=1;iN;i+)for(j=1;j=i;j+)if(ai.servetimeaj.servetime)t=ai;ai=aj;aj=t;printf(n进程调度顺序为:n);for(i=0;iN;i+)printf(%5s,ai.pro_name);

18、printf(n);a0.starttime=a0.arrivetime;a0.finishtime=a0. servetime+a0.starttime;a0.circle_time=a0.finishtime-a0.arrivetime;a0.d_circle_time=a0.circle_time/a0.servetime;for(j=1;jN;j+)aj.starttime=aj-1.servetime+aj-1.starttime;aj.finishtime=aj.servetime+aj.starttime;aj.circle_time=aj.finishtime-aj.arriv

19、etime;aj.d_circle_time=aj.circle_time/aj.servetime;printf(n进程调度列表:n);printf(nametarrivetservetstarttfinishtcircletd_circlen);for(i=0;iN;i+)printf(%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,ai.pro_name, ai.arrivetime,ai.servetime,ai.starttime,ai.finishtime,ai.circle_time,ai.d_circle_time);return 0; Sjf进程调度运行结

20、果:HRF算法实现:#include int main(void)struct processchar name10;float arrivetime;float servetime;floatstarttime;floatfinishtime;floatcycle_time;floatd_cycle_time;pro100;int i,j,N,t,k,l=1;int count=1;float add,min_arrive,priority,max=0;process temp;printf(请输入进程数:);scanf(%d,&N);printf(请输入进程信息(包括进程名、进程到达时间、

21、进程服务时间)n);for(i=0;iN;i+)printf(请输入第 %d个 进程的信息,i+1);scanf(%s%f%f,&proi.name,&proi.arrivetime,&proi.servetime);min_arrive=pro0.arrivetime;for(i=0;iN;i+)if(proi.arrivetimemin_arrive)min_arrive=proi.arrivetime;t=i;temp=prot;prot=pro0;pro0=temp;add=pro0.arrivetime+pro0.servetime;pro0.starttime=add;while(

22、countN)for(i=count;iN;i+)if(proi.arrivetimemax)max=priority;k=i;count+;add=add+prok.servetime;temp=prok;prok=prol;prol=temp;prol.starttime=add;l=l+1;printf(n进程调度顺序为:n);for(i=0;iN;i+)printf(t%s,proi.name);printf(nn);for(i=0;iN;i+)proi.finishtime=proi.starttime+proi.servetime;proi.cycle_time=proi.fini

23、shtime-proi.arrivetime;proi.d_cycle_time=proi.cycle_time/proi.servetime;printf(进程调度列表如下:2n);printf(tnametarrivetservetstarttfinishtcycletd_cyclen);for(i=0;iN;i+)printf(t%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ftn,proi.name, proi.arrivetime,proi.servetime,proi.starttime,proi.finishtime,proi.cycle_time,proi.d_

24、cycle_time);return 0;HRF进程调度运行结果:时间片轮转调度算法:#include int main(void)struct processchar name10;float arrivetime;float servetime;float starttime;float finishtime;float cycletime;float d_cycletime;pro100;float size;int i,j,N,count=0;float resttime100,time;printf(t*时间片轮转调度算法*nn);printf(please input the pr

25、ocess number:);scanf(%d,&N);printf(please input the processes information(name and servetime):n);for(i=0;iN;i+)printf(please input the %th process information:,i+1);scanf(%s%f,&proi.name,&proi.servetime);printf(n);printf(please input the size of time:);scanf(%f,&size);for(i=0;iN;i+)proi.arrivetime=0

26、;pro0.starttime=0;for(i=1;iN;i+)if(proi-1.servetimesize)proi.starttime=proi-1.starttime+proi-1.servetime;else proi.starttime=proi-1.starttime+size;for(i=0;iN;i+)resttimei=proi.servetime;while(count!=N)for(i=0;iN;i+)if(resttimei!=0)if(resttimei=size)time=time+resttimei;proi.finishtime=time;resttimei=

27、0;count+=1;else resttimei=resttimei-size;time=time+size;printf(n);pro0.cycletime=pro0.finishtime-pro0.arrivetime;pro0.d_cycletime=pro0.cycletime/pro0.servetime;for(i=1;iN;i+)proi.cycletime=proi.finishtime-proi.arrivetime;proi.d_cycletime=proi.cycletime/pro0.servetime;printf(n the list of the process

28、es information:n);printf(tnametarrivetservetstarttfinishtcycletd_cyclen);for(i=0;iN;i+)printf(t%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,proi.name,proi.arrivetime,proi.servetime,proi.starttime,proi.finishtime,proi.cycletime,proi.d_cycletime);printf(n);return 0;运行结果:六、实验体会或对改进实验的建议FCF、SJF以及HRF三个算法比较简单一点,后面的时

29、间片轮转调度算法比较有难度,看了好久的书,反复思考才有点顿悟,总的来说还是比较顺利了!c语言编程功力有待加强!要努力了!七、参考资料C语言程序设计、计算机操作系统南昌大学实验报告 -存储管理的模拟实现 一、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。二、实验内容1过随机数产生一个指令序列,共320条指令。其地址按下述原则生成:50%的指令是顺序执行的;25%的指令是均匀分布在前地址部分;25%的指令是均匀分布在后地址部分;#具体的实施方

30、法是:A. 在0,319的指令地址之间随机选区一起点M;B. 顺序执行一条指令,即执行地址为M+1的指令;C. 在前地址0,M+1中随机选取一条指令并执行,该指令的地址为M;D. 顺序执行一条指令,其地址为M+1;E. 在后地址M+2,319中随机选取一条指令并执行;F. 重复AE,直到执行320次指令。2指令序列变换成页地址流 设:(1)页面大小为1K;(1) 用户内存容量为4页到32页;(2) 用户虚存容量为32K。在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为: 第0条第9条指令为第0页(对应虚存地址为0,9); 第10条第19条指令为第1页(对应虚存

31、地址为10,19); 。 第310条第319条指令为第31页(对应虚存地址为310,319);按以上方式,用户指令可组成32页。3. 计算并输出下述各种算法在不同内存容量下的命中率。A. FIFO先进先出的算法B. LRU最近最少使用算法CLFU最少访问页面算法三、实验要求1、需写出设计说明;2、设计实现代码及说明3、运行结果;四、主要实验步骤FCFS算法设计说明:按照所要求的产生随机指令序列,存放在order320这个数组中。通过循环产生这些随机指令,每产生一条都要进行下列判断:是否和内存中即mem_volume4中存放的页面相同,如果相同则不做任何操作,如果不相同,则产生缺页,相应的缺页次

32、数加一,按照fcfs将最先进入内存的页数淘汰,并将该页写到内存中去。重复上面的操作直到完成这320条指令。Fcfs页面置换算法实现代码:#include #include #include int main(void)int order320,mem_volume4=100,100,100,100;int l=0,i=0,j,num=0,cx,sign=0,add=0;float value=0,sum=0;srand(time(NULL);for(cx=0;cx10;cx+)while(i320)orderi=rand()%320; /产生随机数放order中for(j=0;j4;j+)if

33、(orderi+1)/10=mem_volumej)sign=1;/通过sign标识判断所调页数是否在内存块中if(sign)sign=0;elsel+;if(mem_volume3=100)mem_volume3=(orderi+1)/10;/ 保证第一次调入的页面都产生缺页elsemem_volumenum=(orderi+1)/10; /将所缺页调入到内存块中num=(num+1)%4; /num值为下次所要置换出去的内存块中对应的页数i+;orderi=rand()%(orderi-1+2);for(j=0;j4;j+)if(orderi/10=mem_volumej)sign=1;i

34、f(sign)sign=0;else l+;if(mem_volume2=100)mem_volume2=orderi/10;elsemem_volumenum=orderi/10;num=(num+1)%4;i+;orderi=orderi-1+1;for(j=0;j4;j+)if(orderi/10= mem_volumej)sign=1;if(sign)sign=0;elsel+;if(mem_volume1=100)mem_volume1=orderi/10;elsemem_volumenum=orderi/10;num=(num+1)%4; i+;orderi=rand()%(319

35、-orderi-1-2)+(orderi-1+2);for(j=0;j4;j+)if(orderi/10=mem_volume0)sign=1;if(sign)sign=0;else l+;if(mem_volume0=100)mem_volume0=(orderi+1)/10;elsemem_volumenum=orderi/10;num=(num+1)%4; i+;value=l/320.0*100;add=add+l;sum=sum+value;printf(2*FCFS页面置换算法*2n);printf(*最后一次指令序列*);for(i=0;i320;i+)if(i%10=0)pri

36、ntf(n);printf(%5d,orderi);printf(n);printf(*n);printf(tt十次的平均缺页数为%dntt十次的平均缺页率为%.3f%,add/10,sum/10);return 0;程序运行结果:LRU页面置换算法设计说明:这个算法同FCFS算法的不同之处在于,每产生一条随机指令,如果和4个内存块中的某一个页数相同的话,就要对这4个内存块中的页数重新排序,将每次要置换出去的页数放在mem_volume3中,这样,在每次产生缺页的时候,都先将所缺页数写入到该内存块,然后再排序,将其放到mem_volume0中去。LRU页面置换算法实现代码:#include #include #include int main(void)int order320,mem_volume4=100,100,100,100;int l=0,i=0,j,cx;int num,temp=0,ex_chan=0,add=0;float value=0,sum=0;srand(time(NULL);for(cx=0;cx10;cx

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1