操作系统综合实验_第1页
操作系统综合实验_第2页
操作系统综合实验_第3页
操作系统综合实验_第4页
操作系统综合实验_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华北科技学院计算机学院综合性实验实 验 报 告 课程名称 计算机操作系统 实验学期 2015 至 2016 学年 第 一 学期学生所在系部 计算机系 年级 2013 专业班级 计科B133 学生姓名 谢培旗 学号 9 任课教师 王祥仲 实验成绩 计算机学院制 计算机操作系统 课程综合性实验报告开课实验室: 基础二 2015 年 12 月 4 日实验题目进程调度算法模拟程序设计一、实验目的通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并

2、安装相关的程序开发环境,如C C+Java 等编程语言环境。三、实验内容(1)用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: 进程标识数ID。 进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 进程已占用CPU时间CPUTIME。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片

3、后,进程将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则: 进程在就绪队列中呆一个时间片,优先数增加1。 进程每运行一个时间片,优先数减3。(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。(5)分析程序运行的结果,谈一下自己的认识。四、实验结果及分析本实验设计到三个进程调度,分别是:先来先服务调度算法,非抢占式短进程调度算法,最高响应比优

4、先调度算法。以下为本次实验结果截图及分析:程序运行界面截图:1. 先来先服务调度算法分析:当在进程调度中采用FCFS算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,进程调度才将处理机分配给其它进程。程序计算结果如图,设有5个进程:a、b、c、d、e在不同时间到达,按其到达时间排序则为:a-b-c-d-e,即调用先来先服务算法以后进程运行的顺序是:a-b-c-d-e。2. 非抢占式短进程调度算法SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算

5、法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。程序计算结果如图,设有5个进程:a、b、c、d、e在不同时间到达,按其所需服务时间长短排序则为:a-b-e-c-d,即调用非抢占式短进程优先调度算法以后进程运行的顺序是:a-b-e-c-d。3. 最高响应比优先调度算法 (/注:该截图一小处地方是错的)如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断滴增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描

6、述为:优先权=1+等待时间/要求服务时间 。由上式可以看出:1.如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而类似于SJF算法,有利于短作业。2.当要求服务时间相同时,作业的优先权又决定于其等待时间,因而该算法又类似于FCFS算法。3.对于长作业的优先级,可以随着等待时间的增加而提高,当期等待时间足够长时,也可以过得处理机。因此该算法实现了较好的折中。当然,在利用该算法时,每次要进行调度之前,都需要先做响应比的计算,显然会增加系统开销。设有5个进程:a、b、c、d、e在不同时间到达,显然a、b按顺序执行,然后计算c、d、e的优先权,计算得出优先权:cde,于是c进入进程调度,

7、此时,d、e的等待时间延长,需重新计算d、e的优先权,计算得出优先权ed,于是e进入进程调度,最后执行d。 实验体会:进程调度算法的优劣对于系统运行至关重要,进程调度影响着系统运行的速度以及系统开销。在本次实验,本人早早地开始想如何根据书本进程调度的知识敲代码,但开始做还是最近两天,总的来说比较满意,不足的地方即是运行时界面排版由于精度的问题没有更好的解决。在实验过程中,本人重温了课本上的知识,又锻炼了实践能力。源代码: #include #include #include using namespace std;struct fcfs /先来先服务算法从这里开始 char name10; f

8、loat arrivetime; float servicetime; float starttime; float finishtime; float zztime; float dqzztime; ; /定义一个结构体,里面包含的有一个进程相关的信息 fcfs a100; void input(fcfs *p,int N) int i; coutendl; printf( 请您输入进程的 名字 到达时间 服务时间: (例如: a 0 100)nn); for(i=0;i=N-1;i+) printf( 请您输入进程%d的信息:t,i+1);scanf(ttt%s%f%f,&,

9、&pi.arrivetime,&pi.servicetime); void Print(fcfs *p,float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float dqzztime,int N) int k; printf(nn调用先来先服务算法以后进程运行的顺序是: ); printf(%s,); for(k=1;k%s,); coutendl; printf(n 具体进程调度信息:n); printf(t进程名 到达时间 服务时间 开始时间 结束时间

10、 周转时间 带权周转时间n); for(k=0;k=N-1;k+) printf(t%st%-.2ft %-.2ft %-.2ft %-.2ft %-.2ft %-.2fn,,pk.arrivetime, pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.dqzztime); getchar(); /此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪 void sort(fcfs *p,int N) /排序 for(int i=0;i=N-1;i+) for(int j=0;j=i;

11、j+) if(pi.arrivetimepj.arrivetime) fcfs temp; temp=pi; pi=pj; pj=temp; void deal(fcfs *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N) /运行阶段 int k; for(k=0;k=N-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivetime+pk.service

12、time; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.servicetime; for(k=0;k=N-1;k+) pk.zztime=pk.finishtime-pk.arrivetime; pk.dqzztime=pk.zztime/pk.servicetime; void FCFS(fcfs *p,int N) float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; sort(p,N); dea

13、l(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N); getchar(); /先来先服务算法到此结束 struct sjf/最短进程优先调度算法从这里开始 char name10;float arrivetime; /到达时间float servicetime; /运行时间float starttime; /开始时间float finishtime; /完成时间float

14、 zztime; float dqzztime; ;sjf a1100;void input(sjf *p,int N1)/进程信息输入 int i;coutendl; printf( 请您输入进程的 名字 到达时间 服务时间: (例如: a 0 100)n); for(i=0;i=N1-1;i+) printf( 请您输入进程%d的信息:t,i+1); scanf(ttt%s%f%f,&,&pi.arrivetime,&pi.servicetime);void Print(sjf *p,float arrivetime,float servicetime,float start

15、time,float finishtime,float zztime,float dqzztime,int N1)/最终结果输出 int k; printf(nt调用非抢占短作业优先调度算法以后进程的调度顺序为:); printf(%s,); for(k=1;k%s,); coutendl; printf(n 具体进程调度信息:n); printf(t进程名 到达时间 服务时间 开始时间 结束时间 周转时间 带权周转时间n); for(k=0;k=N1-1;k+) printf(t%st%-.2ft %-.2ft %-.2ft %-.2ft %-.2ft %-.2f

16、n,,pk.arrivetime, pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.dqzztime); getchar(); void sort(sjf *p,int N1)/排序 for(int i=0;i=N1-1;i+) for(int j=0;j=i;j+) if(pi.arrivetimepj.arrivetime) sjf temp; temp=pi; pi=pj; pj=temp; void deal(sjf *p, float arrivetime,float servicetime,float st

17、arttime,float finishtime,float &zztime,float &dqzztime,int N1)/运行阶段 int k; for(k=0;k=N1-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivetime+pk.servicetime; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+pk.servicetime; for(k=0;k=N1-1;k+) pk.zztime=pk.finishtime-pk

18、.arrivetime; pk.dqzztime=pk.zztime/pk.servicetime; void sjff(sjf *p,int N1) float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; sort(p,N1); for(int m=0;mN1-1;m+) if(m=0) pm.finishtime=pm.arrivetime+pm.servicetime; else pm.finishtime=pm-1.finishtime+pm.servicetime; int i=0;

19、 for(int n=m+1;n=N1-1;n+) if(pn.arrivetime=pm.finishtime) i+; float min=pm+1.servicetime; int next=m+1; for(int k=m+1;km+i;k+) if(pk+1.servicetimemin) min=pk+1.servicetime; next=k+1; sjf temp; temp=pm+1; pm+1=pnext; pnext=temp; deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N1);

20、Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N1); getchar(); /最短进程优先调度算法到这里结束 struct jdsjp /最高响应比优先调度算法从这里开始 char name10; /作业号float arrivetime; /作业到达时间float servicetime; /作业要求服务时间float waitime; /等待时间float starttime; /开始运行时间float finishtime; /结束运行时间float zztime; /周转时间float dqzz

21、time; /带权周转时间; /定义一个结构体,里面包含的有一个进程相关的信息 jdsjp a3100; void input(jdsjp *p,int N3) int i; coutendl; printf( 请您输入进程的 名字 到达时间 服务时间: (例如: a 0 100)nn); for(i=0;i=N3-1;i+) printf( 请您输入进程%d的信息:t,i+1);scanf(ttt%s%f%f,&,&pi.arrivetime,&pi.servicetime); void Print(jdsjp *p,float arrivetime,float service

22、time,float starttime,float finishtime,float zztime,float dqzztime,int N3) int k; printf(nn最高响应比优先调度算法以后进程运行的顺序是: ); printf(%s,); for(k=1;k%s,); coutendl; printf(n 具体进程调度信息:n); printf(t进程名 到达时间 服务时间 开始时间 结束时间 周转时间 带权周转时间n); for(k=0;k=N3-1;k+) printf(t%st%-.2ft %-.2ft %-.2ft %-.2ft %-.2f

23、t %-.2fn,,pk.arrivetime, pk.servicetime,pk.starttime,pk.finishtime,pk.zztime,pk.dqzztime); getchar(); /此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪 void sort(jdsjp *p,int N3) /排序 for(int i=0;i=N3-1;i+) for(int j=0;j=i;j+) if(pi.arrivetimepj.arrivetime) jdsjp temp; temp=pi; pi=pj; pj=temp; voi

24、d deal(jdsjp *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &dqzztime,int N3) /运行阶段 int k; for(k=0;k=N3-1;k+) if(k=0) pk.starttime=pk.arrivetime; pk.finishtime=pk.arrivetime+pk.servicetime; else pk.starttime=pk-1.finishtime; pk.finishtime=pk-1.finishtime+

25、pk.servicetime; for(k=0;k=N3-1;k+) pk.zztime=pk.finishtime-pk.arrivetime; pk.dqzztime=pk.zztime/pk.servicetime; void JDSJP(jdsjp *p,int N3) float arrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0; sort(p,N3); for(int m=0;mN3-1;m+) / if(m=0)pm.finishtime = pm.arrivetime +pm.serv

26、icetime ; else pm.finishtime = pm-1.finishtime +pm.servicetime ; int i=0,n; for(n=m+1;n=N3-1;n+) if(pn.arrivetime=pm.finishtime ) i+; float max=(pm.finishtime -pm+1.arrivetime)/pm+1.arrivetime; /第m+1个的响应比 int follow=m+1; for(int k=m+1;km+i;k+) if(max=(pm.finishtime-pk+1.arrivetime)/pk+1.servicetime)

27、max=(pm.finishtime-pk+1.arrivetime)/pk+1.servicetime ;follow=k+1; jdsjp temp; temp=pm+1; pm+1=pfollow; pfollow=temp; / deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N3); Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N3); getchar(); /最高响应比优先调度算法到此结束 char menu()/用来输出相关信息的函数 char cse1; while(1) system(cls); fflush(stdin); coutendl; coutendl; coutendl; coutt| 欢您

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论