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

实验报告实验课程:计算机操作系统学生姓名:学号:专业班级:____年12月19日目录实验一编程实现银行家安全算法实验二进程调度算法的实现实验三存储管理的模拟实现

一、实验目的通过实验加强对银行家安全算法的理解和掌握。

二、实验内容熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。

三、实验要求

1、需写出设计说明;

2、设计实现代码及说明

3、运行结果;

四、主要实验步骤设计说明:假定系统中有五个进程P0,P1,P2,P3,P4和三类资源的数量分别为

10、

5、7,在T0时刻的资源分配情况如下图示:资源情况进程Ma_A

六、实验体会或对改进实验的建议程序比较长,用到了上学期的c语言编程,感觉主要是count比较难把握,程序算法还是比较清晰,就是自己编一个程序有一定难度,必须多加练习了。做完后对银行家算法有更深的理解。南昌大学实验报告-进程调度算法的实现

一、实验目的通过实验加强对进程调度算法的理解和掌握。

二、实验内容编写程序实现进程调度算法,具体可以编写程序实现先来先服务算法或优先度高者调度算法。

三、实验要求

1、需写出设计说明;

2、设计实现代码及说明;

3、运行结果四实验主要过程和步骤前三个算法主要是解决进程调度的顺序问题,最后一个时间片轮转调度主要是解决每个进程的完成时间,所以以下算法主要对此进行说明。FCFS进程调度算法设计:建立一个结构体数组pro100,每个结构体中都存有各进程相关信息,然后输入进程数N确定进程数,并输入各进程的相关信息。通过fcfs算法对按照所输入进程的arrivetime的大小进行排序,排好的序即为进程调度的执行顺序。最后再通过对个进程的其他数据进行简单处理即可。SJF进程调度算法设计:SJF的算法设计基本同上。只是在排序过程中稍有不同,它是按照进程的服务时间servetime来安排进程的调度顺序的。HRF进程调度算法设计:通过建立add值,对进程执行完后时间的累计,用来计算下一个进程的等待时间,add初始值为第一个进程执行后的完成时间。从第二个进程开始进行优先级priority的比较,然后记录下优先级最大的进程的标号k,并与第二进程进行调换,下一次再通过同样的方法找到最大优先级的进程同第三个进程进行调换,依次类推直到执行完所有的进程。其中通过count值控制每次执行的循环次数,l值标明下次所要调换的程序的标号。时间片轮转调度算法:首先,用过一个N次的循环计算每个进程的开始时间starttime,对每个进程首先判断proi-

XXX是否小于时间片大小size,如果小于size就让XXX等于proi-

XXX加上proi-

XXX,否则的话,就让其加上时间片大小size。下来接着处理完成时间,首先为每个进程建立resttime的数组,用来存放每个进程执行一次的剩余时间,并将每个进程的servetime值对应的赋给它,然后通过用一个while(count!=N)的循环控制所有的进程是否完成,最后在这个循环里面对每个进程检测,看它的resttime是否为0,如果为0说明它已经完成,否则判断他的resttime是否小于等于size,如果小于说明本次就能完成本进程,并将time的值赋给finishtime,否则的话就将resttime值减size,并将time值加size,这样不断地循环执行,知道N个进程全部执行完毕。FCFS进程调度算法实现代码:#includeintmain(void)structprocesscharpro_name10;floatarrivetime;floatservetime;floatstarttime;floatfinishtime;floatcircle_time;floatd_circle_time;a100;/用结构体存放各进程的相关信息inti,j,k,N;processtemp;printf(请输入进程数:);scanf(%d,&N);/进程数printf(请输入进程信息(包括进程名、进程到达时间、进程服务时间):n);for(i=0;iN;i+)printf(请输入第%d个进程的信息:,i+1);scanf(%s%f%f,&XXX,&XXX,&XXX);for(i=0;iN;i+)for(j=0;j=i;j+)if(XXXaj.arrivetime)temp=ai;ai=aj;aj=temp;/按照FCFS算法对进程进行排序printf(nFCFS进程调度顺序为:n);for(k=0;kN;k+)printf(%5s,XXX);printf(n);XXX.arrivetime;XXX.servetime+XXX;XXXXXX;XXX.circle_time/XXX;/计算第一个进程的相关信息for(i=1;iN;i+)XXX

XXX

XXX;XXX.servetime+XXX;XXXXXX;XXX.circle_time/XXX;/计算其他进程的相关信息printf(n进程调度列表:n);printf(nametarrivetservetstarttfinishtcircletd_circlen);for(i=0;iN;i+)printf(%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,XXX,XXX,XXX,XXX,XXX,XXX,XXX);return0;运行结果;fcfs进程调度运行结果SJF进程调度算法实现代码:#includeintmain(void)structprocesscharpro_name10;floatarrivetime;floatservetime;floatstarttime;floatfinishtime;floatcircle_time;floatd_circle_time;a100;inti,j,k=0,N;processtemp;processt;printf(请输入进程数:);scanf(%d,&N);printf(请输入进程信息(包括进程名、进程到达时间、进程服务时间:n);for(i=0;iN;i+)printf(请输入第%d个进程的信息,i+1);scanf(%s%f%f,&XXX,&XXX,&XXX);floatmin=XXX;for(i=0;iN;i+)if(XXXrivetimemin)min=XXX;k=i;printf(n);temp=a0;a0=ak;ak=temp;for(i=1;iN;i+)for(j=1;j=i;j+)if(XXX.servetime)t=ai;ai=aj;aj=t;printf(n进程调度顺序为:n);for(i=0;iN;i+)printf(%5s,XXX);printf(n);XXX.arrivetime;XXX.servetime+XXX;XXXXXX;XXX.circle_time/XXX;for(j=1;jN;j+)XXX

XXX

XXX;XXX.servetime+XXX;XXXXXX;XXX.circle_time/XXX;printf(n进程调度列表:n);printf(nametarrivetservetstarttfinishtcircletd_circlen);for(i=0;iN;i+)printf(%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,XXX,XXX,XXX,XXX,XXX,XXX,XXX);return0;Sjf进程调度运行结果:HRF算法实现:#includeintmain(void)structprocesscharname10;floatarrivetime;floatservetime;floatstarttime;floatfinishtime;floatcycle_time;floatd_cycle_time;pro100;inti,j,N,t,k,l=1;intcount=1;floatadd,min_arrive,priority,ma_=0;processtemp;printf(请输入进程数:);scanf(%d,&N);printf(请输入进程信息(包括进程名、进程到达时间、进程服务时间)n);for(i=0;iN;i+)printf(请输入第%d个进程的信息,i+1);scanf(%s%f%f,&XXX,&XXX,&XXX);min_arrive=XXX;for(i=0;iN;i+)if(XXXmin_arrive)min_arrive=XXX;t=i;temp=prot;prot=pro0;pro0=temp;add=XXXime+XXX;XXX;while(countN)for(i=count;iN;i+)if(XXX)ma_=priority;k=i;count+;add=add+XXX;temp=prok;prok=prol;prol=temp;XXX;l=l+1;printf(n进程调度顺序为:n);for(i=0;iN;i+)printf(t%s,XXX);printf(nn);for(i=0;iN;i+)XXX.starttime+XXX;XXXXXX;XXX.cycle_time/XXX;printf(进程调度列表如下:2n);printf(tnametarrivetservetstarttfinishtcycletd_cyclen);for(i=0;iN;i+)printf(t%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2ftn,XXX,XXX,XXX,XXX,XXX,XXX,XXX);return0;HRF进程调度运行结果:时间片轮转调度算法:#includeintmain(void)structprocesscharname10;floatarrivetime;floatservetime;floatstarttime;floatfinishtime;floatcycletime;floatd_cycletime;pro100;floatsize;inti,j,N,count=0;floatresttime100,time;printf(t时间片轮转调度算法nn);printf(pleaseinputtheprocessnum

XXX)XXX

XXX

XXX;elseXXX

XXX;for(i=0;iN;i+)resttimei=XXX;while(count!=N)for(i=0;iN;i+)if(resttimei!=0)if(resttimei=size)time=time+resttimei;XXX;resttimei=0;count+=1;elseresttimei=resttimei-size;time=time+size;printf(n);XXXXXX;XXXXXX.servetime;for(i=1;iN;i+)XXXXXX;XXX.cycletime/XXX;printf(nthelistoftheprocessesinformation:n);printf(tnametarrivetservetstarttfinishtcycletd_cyclen);for(i=0;iN;i+)printf(t%st%.2ft%.2ft%.2ft%.2ft%.2ft%.2fn,XXX,XXX,XXX,XXX,XXX,XXX,XXX);printf(n);return0;运行结果:

六、实验体会或对改进实验的建议FCF、SJF以及HRF三个算法比较简单一点,后面的时间片轮转调度算法比较有难度,看了好久的书,反复思考才有点顿悟,总的来说还是比较顺利了!c语言编程功力有待加强!要努力了!

七、参考资料C语言程序设计、计算机操作系统南昌大学实验报告-存储管理的模拟实现

一、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。

二、实验内容1过随机数产生一个指令序列,共320条指令。其地址按下述原则生成:50%的指令是顺序执行的;25%的指令是均匀分布在前地址部分;25%的指令是均匀分布在后地址部分;#具体的实施方法是:

c.在0,319的指令地址之间随机选区一起点M;

(1)页面大小为1K;

(1)用户内存容量为4页到32页;

(2)用户虚存容量为32K。在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条第9条指令为(对应虚存地址为0,9);第10条第19条指令为(对应虚存地址为10,19);。第310条第319条指令为第31页(对应虚存地址为310,319);按以上方式,用户指令可组成32页。

3.计算并输出下述各种算法在不同内存容量下的命中率。

XXX先进先出的算法

三、实验要求

1、需写出设计说明;

2、设计实现代码及说明

3、运行结果;

四、主要实验步骤FCFS算法设计说明:按照所要求的产生随机指令序列,存放在order320这个数组中。通过循环产生这些随机指令,每产生一条都要进行下列判断:是否和内存中即mem_volume4中存放的页面相同,如果相同则不做任何操作,如果不相同,则产生缺页,相应的缺页次数加一,按照fcfs将最先进入内存的页数淘汰,并将该页写到内存中去。重复上面的操作直到完成这320条指令。Fcfs页面置换算法实现代码:#include#include#includeintmain(void)intorder320,mem_volume4=100,100,100,100;intl=0,i=0,j,num=0,c_,sign=0,add=0;floatvalue=0,sum=0;srand(time(NULL);for(c_=0;c_10;c_+)while(i320)orderi=rand%320;/产生随机数放order中for(j=0;j4;j+)if(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;if(sign)sign=0;elsel+;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-orderi2)+(orderi-1+2);for(j=0;j4;j+)if(orderi/10=mem_volume0)sign=1;if(sign)sign=0;elsel+;if(mem_volume0=100)mem_volume0=(orderi+1)/10;elsemem_volumenum=orderi/10;num=(num+1)%4;i+;value=l/3

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

预览已结束,下载原文档直接使用
查看全文
若对以上有内容有疑问请反馈或举报举报
声明:
您购买的是此内容的word文档,付费前可通过免费阅读辨别合同。非质量问题不退款,如需帮助可咨询客服【客服微信】