进程调度算法_第1页
进程调度算法_第2页
进程调度算法_第3页
进程调度算法_第4页
进程调度算法_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计报告题目:进程调度算法院班院班姓学级:名:号:指导教师:进程调度算法设计报告一、概述本次设计的程序主要功能是模拟CPU的进程调度过程,实现先来先服务调度算法、短作业优先调度算法、非抢占优先权调度算法、时间片轮转法四个进程调度算法,并根据输入的数据和相应的调度算法计算每个进程的调度结果,对四个算法的平均周转时间进行比较和评价。通过这四种调度算法的比较,有利于加深对四种算法的理解,使用户能够更好、更快的运用四种调度算法。、设计的基本概念和原理1、基本概念(1)到达时间:指进程到达CPU的时间。(2)服务时间:指进程需要CPU执行的时间。(3)完成时间:指进程执行完成的时间。(4)周转时间:指进程从到达到执行完成所经过的时间。(5)带权周转时间:进程的周转时间与服务时间的比值(6)平均周转时间:一个调度算法中所有进程的周转时间的平均值。(7)平均带权周转时间:一个调度算法中所有进程的带权周转时间的平均值。2、基本原理(1)FCFS调度算法1)输入各个进程的信息2)按照进程的到达时间从小到大进行排序3)计算出各个进程的完成时间,随后算出周转时间等,并打印出4)输出甘特图(2)SPF调度算法1)输入各个进程的信息2)按照进程的到达时间从小到大进行排序3)再逐个判断到达进程的个数,并根据进程服务时间的长短排序4)计算出各个进程的完成时间,随后算出周转时间等,并打印出5)输出甘特图(3)非抢占高优先权优先调度算法1)输入各个进程的信息,2)按照进程的到达时间从小到大进行排序3)再逐个判断到达进程的个数,并根据进程优先权的大小排序4)计算出各个进程的完成时间,随后算出周转时间等,并打印出5)输出甘特图(4)基于时间片的轮转调度算法1)输入各个进程的信息,2)按照进程的到达时间从小到大进行排序3)再逐个分配时间片,当时间片用完,分配给下一进程4)计算出各个进程的完成时间,随后算出周转时间等,并打印出5)输出甘特图三、总体设计数据结构:结构体typedefstructprocess(charname;//进程名floatarrivetime;//到达时间floatservetime;//服艮务时间;floatstarttime;//开始执行时间floatfinishtime;//完成时间floatroundtime;//周转时间floatdaiquantime;//带权周转时间}FCFS,SJF,SJP,KQZ算法流程:1)输入各个进程的信息,2)按照进程的到达时间从小到大进行排序3)进行相应操作4)计算出各个进程的完成时间,随后算出周转时间等,并打印出5)输出甘特图程序流程图四、详细设计先来先服务#include<iostream>#include<iomanip>流程图usingnamespacestd;typedefstructprocess_FCFS{charname;//进程名floatarrivetime;//到达时间floatservetime;//服务时间;floatstarttime;//开始执行时间floatfinishtime;//完成时间floatroundtime;//周转时间floatdaiquantime;//带权周转时间}FCFS;〃按到达时间进行冒泡排序structprocess_FCFS*sortarrivetime(structprocess_FCFSa[],intn){inti,j;structprocess_FCFSt;intflag;for(i=1;i<n;i++){flag=0;for(j=0;j<n-i;j++){if(a[j].arrivetime>a[j+1].arrivetime){t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;//交换}}if(flag==0)〃如果一趟排序中没发生任何交换,则排序结束break;}returna;}voidfcfs(structprocess_FCFSa[],intn){inti;a[0].starttime=a[0].arrivetime;a[0].finishtime=a[0].arrivetime+a[0].servetime;a[0].roundtime=a[0].finishtime-a[0].arrivetime;a[0].daiquantime=a[0].roundtime/a[0].servetime;for(i=1;i<n;i++){if(a[i].arrivetime<a[i-1].finishtime)a[i].starttime=a[i-1].finishtime;elsea[i].starttime=a[i].arrivetime;a[i].finishtime=a[i].starttime+a[i].servetime;a[i].roundtime=a[i].finishtime-a[i].arrivetime;a[i].daiquantime=a[i].roundtime/a[i].servetime;}cout<<""<<endl;cout<<"进程名|到达时间|服务时间|执行时间|完成时间|周转时间|带权时间|"<<endl;cout<<""<<endl;for(i=0;i<n;i++){cout<<""<<a[i].name<<”"<<a[i].arrivetime<<setw(9)<<a[i].servetime<<setw(9)<<a[i].starttime<<setw(9)<<a[i].finishtime<<setw(9)<<a[i].roundtime<<setw(9)<<a[i].daiquantime<<endl;cout<<""<<endl;}cout<<"进程调度的甘特图为:"<<endl;for(i=0;i<n-1;i++)cout<<a[i].name<<”--->”;cout<<a[n-1].name;}intmain(){structprocess_FCFSa[100];inti,n;cout<<"请输入进程的数目"<<endl;cin>>n;//getchar();for(i=0;i<n;i++){cout<<"请输入第"<<i+1<<"个进程的进程名"<<endl;cin>>a[i].name;cout<<"请输入第"<<i+1<<"个进程的到达时间"<<endl;cin>>a[i].arrivetime;cout<<"请输入第"<<i+1<<"个进程的服务时间"<<endl;cin>>a[i].servetime;sortarrivetime(a,n);fcfs(a,n);}短作业优先#include<iostream>#include<iomanip>usingnamespacestd;typedefstructprocess_SJF{charname;//进程名floatarrivetime;//到达时间floatservetime;//服务时间;floatstarttime;//开始执行时间floatfinishtime;//完成时间floatroundtime;//周转时间floatdaiquantime;//带权周转时间}SJF;structprocess_SJF*sortarrivetime(structprocess_SJFa[],intn){inti,j;structprocess_SJFt;intflag;for(i=1;i<n;i++){flag=0;for(j=0;j<n-i;j++){if(a[j].arrivetime>a[j+1].arrivetime){t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;//交换}}if(flag==0)//如果一趟排序中没发生任何交换,则排序结束break;}returna;}voidsjf(structprocess_SJFa[],intn){inti,j,m,p,Min;structprocess_SJFt;a[0].finishtime=a[0].servetime+a[0].arrivetime;for(i=1;i<n;i++){a[i].finishtime=0;}j=0;m=0;p=0;for(i=m+1;i<n;i++){for(j=m+1;j<n;j++){if(a[j].arrivetime<a[m].finishtime){p++;}elsebreak;}Min=m+1;if(p>1){for(j=m+2;j<=m+p;j++){if(a[j].servetime<a[Min].servetime)Min=j;}t=a[Min];a[Min]=a[m+1];a[m+1]=t;a[m+1].finishtime=a[m].finishtime+a[m+1].servetime;}m++;p=0;}a[0].starttime=a[0].arrivetime;a[0].finishtime=a[0].arrivetime+a[0].servetime;a[0].roundtime=a[0].finishtime-a[0].arrivetime;a[0].daiquantime=a[0].roundtime/a[0].servetime;for(i=1;i<n;i++){if(a[i].arrivetime<a[i-1].finishtime)a[i].starttime=a[i-1].finishtime;elsea[i].starttime=a[i].arrivetime;a[i].finishtime=a[i].starttime+a[i].servetime;a[i].roundtime=a[i].finishtime-a[i].arrivetime;a[i].daiquantime=a[i].roundtime/a[i].servetime;}cout<<""<<endl;cout<<"进程名|到达时间|服务时间|执行时间|完成时间|周转时间|带权时间|"<<endl;cout<<""<<endl;for(i=0;i<n;i++){cout<<""<<a[i].name<<”"<<a[i].arrivetime<<setw(9)<<a[i].servetime<<setw(9)<<a[i].starttime<<setw(9)<<a[i].finishtime<<setw(9)<<a[i].roundtime<<setw(9)<<a[i].daiquantime<<endl;cout<<""<<endl;}cout<<"进程调度的甘特图为:"<<endl;for(i=0;i<n-1;i++)cout<<a[i].name<<”--->”;cout<<a[n-1].name;}intmain(){structprocess_SJFa[100];inti,n;cout<<"请输入进程的数目"<<endl;cin>>n;//getchar();for(i=0;i<n;i++){cout<<"请输入第"<<i+1<<"个进程的进程名"<<endl;cin>>a[i].name;cout<<"请输入第"<<i+1<<"个进程的到达时间"<<endl;cin>>a[i].arrivetime;cout<<"请输入第"<<i+1<<"个进程的服务时间"<<endl;cin>>a[i].servetime;}sortarrivetime(a,n);sjf(a,n);五、测试与数据分析测试数据:FCFS:进程到达时间服务时间A01B1100C21D3100SJF:进程到达时间服务时间A04B13C25D32E44RR:进程到达时间服务时间A04B13C25E44六、完成的情况、简要的使用说明完成情况:四个进程调度算法分了四个程序做完,四个程序的运行结果都正确。使用说明:根据提示输入数据,可以得到书上的结果。七、结果分析先来先服务算法结果:时间片轮转法:八、总结在设计进程调度程序的过程中,我遇到过许多问题,可是也学到了很多东西。本程序的设计实现主要是用C++语言实现,通过对程序算法的设计优化、输出显示的格式设计、输入过程中的异常处理等一些设计过程中的问题的考虑解决,在C++学习上也有了很大的进步。程序设计过程中开始遇到的最大的问题是算法的结构设计问题,课本上只给了设计要求及简单的算法,要真正实现还需要考虑很多方面。在算法的数据结构设计上考虑了很长时间。在程序设计中先后参考了很多网络资料,也参考了一些别人写的的程序,对一些算法的优越性等也作了一些考虑。此外考虑最多的就是异常错误处理的设计。一个好的程序必须能在各种环境下都有其相应的处理方式。C++语言明显要比c语言好很多,其输入输出流就要比c的输入输出好用很多.其次就是函数的重载,让我的程序代码减少了很多。String

温馨提示

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

评论

0/150

提交评论