操作系统五种进程调度算法的代码_第1页
操作系统五种进程调度算法的代码_第2页
操作系统五种进程调度算法的代码_第3页
操作系统五种进程调度算法的代码_第4页
操作系统五种进程调度算法的代码_第5页
免费预览已结束,剩余11页可下载查看

付费下载

下载本文档

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

文档简介

1、进程调度算法的模拟实现实验目的 1本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。SRTF。2. 利用程序设计语言编写算法,模拟实现先到先服务算法 FCFS轮转调度算法RR最 短作业优先算法 SJF、优先级调度算法 PRIOR最短剩余时间优先算法 3进行算法评价,计算平均等待时间和平均周转时间。实验内容及结果1先来先服务算法2轮转调度算法3. 优先级调度算法4. 最短时间优先算法5. 最短剩余时间优先算法实验总结而其余均用数组表示。在此次模拟过程中,将 SRTF单独拿了出来用指针表示,完整代码【 Srtf.cpp 代码如下:】/ 最短剩余时间优先算法的实现#include#i

2、nclude#includetypedefstructintremain_time;/ 进程剩余执行时间intarrive_time;/ 进程到达时间intTp;/ 进入就绪队列的时间intTc;/ 进入执行队列的时间intTo;/ 进程执行结束的时间intnumber;/ 进程编号定义进程模块Process_Block;/typedef struct _Queue Process_Block PB;struct _Queue *next;_Block,*Process;/定义一个进程模块队列中结点typedef structProcess head;/Process end;/队列头指针队列

3、尾指针Process_Queue;/ 进程队列Process_Queue PQ; intProcesst;Run_Now;/定义一个全局队列变量/ 全局时间当前正在运行的进程,作为全局变量/void InitQueue(Process_Queue PQ)/*int初始化队列 */elsereturn 1;/ 队列空的条件为头指针指向尾指针并且尾指针指向头指针/*return 0;判定队列是否为空队列 */void EnQueue(Process_Queue PQ,Process P)Process temp =(Process)malloc(sizeof (_Block);temp = PQ.

4、end;temp-next-next = P;PQ.end-next = P; /* 插入队列操作 */Process DeQueue(Process_Queue PQ)if (IsEmpty(PQ) return NULL;Process temp = PQ.head-next;PQ.head-next= temp -next;if (PQ.end-next = temp)PQ.end-next = PQ.head;return temp;/* 出列操作 */Process ShortestProcess(Process_Queue PQ)if(IsEmpty(PQ)/ 如果队列为空,返回i

5、f (!Run_Now)return NULL;elsereturn Run_Now;Process temp,shortest,prev;int min_time;if(Run_Now)/ 如果当前有进程正在执行,shortest = Run_Now;min_time = Run_Now-PB.remain_time;/ 那么最短进程初始化为当前正在执行的进程,PQ.head -next = NULL;PQ.end -next = PQ.head;IsEmpty(Process_Queue PQ)if (PQ.end-next = PQ.head)else/ 如果当前没有进程执行,short

6、est = PQ.head-next;/ 则最短进程初始化为队列中第一个进程min_time = PQ.head-next-PB.remain_time; temp = PQ.head;prev = temp;while (temp-next)if(temp-next-PB.remain_time next;/ 则保存当前进程,min_time = shortest-PB.remain_time;prev=temp;/ 及其前驱temp=temp-next;if(shortest = PQ.end-next)/PQ.end-next = prev;如果最短剩余时间进程是队列中最后一个进程,/

7、则需要修改尾指针指向其前驱prev-next = shortest-next;/修改指针将最短剩余时间进程插入到队头return shortest;/* 调度最短剩余时间的进程至队头*/void Run()Run_Now-PB.remain_time-;/ 某一时间运行它的剩余时间减return ;/* 运行函数 */ void Wait()intreturn sum( int array , int n)int i,sum=0;for (i=0;in;i+)sum+=array i;return sum;intmain()PQ.head= (Process)malloc(sizeof(_Bl

8、ock);PQ.endRun_Now= (Process)malloc(= (Process)malloc(sizeofsizeof(_Block);(_Block);Run_Now=NULL;InitQueue(PQ);int i,N,Total_Time=0;printf( 请输入计算机中的进程数目 :n );/Total_Time 为所有进程的执行时间之和scanf( %d,&N);Process *P,temp;P = (Process*)malloc(N* sizeof (Process);wtint *wt,*circle_t;=(int *)malloc(N* sizeof (

9、int );circle_t =(int *)malloc(N* sizeof (int );for (i=0;iPB.number=i+1;Pi-next=NULL;wti=0;=0;circle_tiprintf(输入第c个进程的到达时间及剩余执行时间:n ,i+1);scanf( %d %d,&Pi-PB.arrive_time,&Pi-PB.remain_time);for (i=0;iPB.remain_time; printf( n 进程按顺序运行依次为 :n );i=0;int k=0;for (t=0;t+)if(Run_Now)/ 如果当前有进程正在执行Run();if (t

10、 = Pi-PB.arrive_time)/ 如果当前时间正好有进程进入if(Pi-PB.remain_time PB.remain_time)temp = Pi;Pi = Run_Now;Run_Now = temp;/ 则调度它至运行队列中,Run_Now-PB.Tp=t;Run_Now-PB.Tc=t;wtRun_Now-PB.number-1+=Run_Now-PB.Tc-Run_Now-PB.Tp;printf( %d ,Run_Now-PB.number);EnQueue(PQ,Pi);Pi-PB.Tp=t;/ 并将当前运行进程重新插入队列中k+;ifelseifi=(i+1)(N

11、-1)?(N-1):(i+1);(Run_Now-PB.remain_time = 0)/ 如果当前进程运行结束,Run_Now-PB.To=t;/ 进程运行结束的时间circle_tRun_Now-PB.number-1 +=t-Run_Now-PB.arrive_time;/ 则将它所占资源释放掉, / 并修改 Run_NoW? NULLfree(Run_Now);Run_Now =NULL;Run_Now = ShortestProcess(PQ);if (!Run_Now)elseif (IsEmpty(PQ) & k = N)Wait();continue ;Run_Now-PB.T

12、c=t;/ 从就绪队列中调出最短剩余时间进程至队头,/ 如果队列为空,转为等待状态break ;wtRun_Now-PB.number-1+=Run_Now-PB.Tc-Run_Now-PB.Tp;printf( %d ,Run_Now-PB.number);/如果当前运行进程为空,那么(t = Pi-PB.arrive_time)/如果正好这时有进程入队k+;EnQueue(PQ,Pi);Run_Now = DeQueue(PQ);/则直接被调入运行队列中Run_Now-PB.Tp=t;Run_Now-PB.Tc=t;printf( %d ,Run_Now-PB.number);i=(i+1

13、)(N-1)?(N-1):(i+1);elseWait();continue ; printf(nprintf(); 平均等待时间是 :n%fn ,( float )sum(wt,N)/N);intleval; /进程优先级intLeftTime;/ 进程运行一段时间后还需要的时间;voidCopy ( Process proc1, Process proc2);voidSort( Process pr,int size) ;/ 把proc2赋值给proc1此排序后按优先级从大到小排列voidsort1(Process pr,int size) ;/voidFcfs( Process pr,i

14、nt num,int此排序后按需要的cpu时间从小到大排列/ 先来先服务算法Timepice);voidvoidTimeTurn( Process process,Priority( Process process,intintvoidmain()inta;num, intnum, intTimepice);/ 时间片轮转算法Timepice);/ 优先级算法printf( 平均周转时间是 :n%fn ,( float )sum(circle_t,N)/N);return 0;/Process.cpp 代码如下:】#include #include using namespace std;cl

15、ass Process public : string ProcessName; / 进程名字intTime; /进程需要时间for ( int i=0; i num; i+)coutcout 1: FCFS 2: 时间片轮换3: 优先级调度4: 最短作业优先 5: 最短剩余时间优先 a;constint Size =30;Process processSize ;int num;int TimePice;cout 输入进程个数 : num;endl;coutTimePice;string name;int CpuTime;int Leval;coutvv 输入第name;cin CpuTim

16、eLeval;processi.ProcessName =name;processi.Time =CpuTime;processi.leval =Leval;coutendl;/ 对进程剩余时间初始化for ( int k=0;knum;k+) processk.LeftTime=processk.Time ;! ) ;cout ( 说明: 在本程序所列进程信息中,优先级一项是指进程运行后的优先级coutendl; coutendl;coutvv 进程名字共需占用CP时间 还需要占用时间 优先级 状态vvendl;if (a=1)Fcfs(process,num,TimePice);else

17、if (a=2)TimeTurn( process, num, TimePice);else if (a=3)Sort( process, num);Priority( process , num, TimePice);else / 最短作业算法,先按时间从小到大排序,再调用 Fcfs 算法即可sort1(process,num);Fcfs(process,num,TimePice);void Copy ( Process proc1, Process proc2) proc1.leval =proc2.leval ;proc1.ProcessName =proc2.ProcessName ;

18、proc1.Time =proc2.Time ;int j=i; void/Sort( Process pr, 直接插入排序int size) / 以进程优先级高低排序for( int i=1;i0 & temp.levalsize/2;d-)Process temp;temp=pr d;pr d = pr size-d-1;pr size-d-1=temp; / 此排序后按优先级从大到小排列/* 最短作业优先算法的实现 */int size) / 以进程时间从低到高排序void sort1 ( Process pr,/ 直接插入排序for ( int i=1;i0 & temp.Time p

19、rj-1.Time )prj = prj-1; j-;prj = temp;/* 先来先服务算法的实现 */void Fcfs( Process process, int num, int Timepice) / process是输入的进程,nun是进程的数目,Time pice是时间片大小while (true )if (num=0)cout 所有进程都已经执行完毕 ! endl;exit(1);if (process0.LeftTime=0)cout 进程 process0.ProcessName 已经执行完毕 ! endl;processi=processi+1;num-;else if

20、 (processnum-1.LeftTime=0)for ( int i=0;inum;i+)cout 所有进程都已经执行完毕! endl; 已经执行完毕 ! endl;cout 进程 processnum-1.ProcessName num-;elsecoutendl;/ 输出正在运行的进程process0.LeftTime=process0.LeftTime- Timepice;process0.leval =process0.leval-1;cout process0.ProcessName process0.Time coutprocess0.LeftTime process0.le

21、val运行coutendl;for (int s=1;snum;s+)processs.Time cout processs.ProcessName coutprocesss.LeftTime processs.leval 等待 endl; ; / else coutendl;system( pause );coutendl; / while/* 时间片轮转调度算法实现 */void TimeTurn( Process process,int num, intTimepice)while (true )if (num=0)cout 所有进程都已经执行完毕! endl;exit(1);if (p

22、rocess0.LeftTime=0)cout 进程 process0.ProcessName 已经执行完毕 ! endl;for ( int i=0;inum;i+)processi=processi+1;num-;已经执行完毕 ! endl;if ( processnum-1.LeftTime =0 )cout 进程 processnum-1.ProcessName 0)coutendl;/ 输出正在运行的进程process0.LeftTime=process0.LeftTime- Timepice;process0.leval =process0.leval-1;cout process

23、0.ProcessName process0.Time coutprocess0.LeftTime process0.leval 运行coutendl;for (int s=1;snum;s+)processs.Time cout processs.ProcessName processs.leval;coutprocesss.LeftTime coutif (s=1)就绪 endl;elsecout等待 endl;Process temp;temp = process0;for ( int j=0;jnum;j+)processj = processj+1;processnum-1 = temp; / elsecoutendl;s

温馨提示

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

评论

0/150

提交评论