操作系统的五种进程调度算法地代码_第1页
操作系统的五种进程调度算法地代码_第2页
操作系统的五种进程调度算法地代码_第3页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、进程调度算法的模拟实现实验目的1 本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。2 .利用程序设计语言编写算法,模拟实现先到先服务算法FCFS、轮转调度算法 RR、最短作业优先算法 SJF、优先级调度算法 PRIOR、最短剩余时间优先算法SRTF。3 .进行算法评价,计算平均等待时间和平均周转时间。实验内容及结果1 .先来先服务算法3:优先缓调度4:最短作业优先5:最翹剩余对闾优*upu时间和优丸级:®Alttif程时阊片大小= lie输入第1个述程的名字.Pl 1U 1输人第空个进程的名字、P2 10 2cpuBjJfl和优先级-输人单3介讲稈的名字、P3 10

2、 3匚的时间和优养级=说归 在本呈序所列进程信息中,优先飯一项是指进程运行后的优先级H ?进程名字共需占用CPU时间还需要占用时间优先逐 状态F1P2P3fs进程P1已经执二完甲f2 轮转调度算法还需宴占用吋间青按任意锥维绞运行Q21010P1P2请按任意犍継綾 - 琏程P2已经执行完毕*请按任鳶镇继续.所葛孵都已帥亍完毕优先级 狀态在本理序所列遴程信息中,优先级一顶是指进穆运行石的忧先级 共需占用砍时间选择谐度算法:_1; FGFS 2:时间片轮换3;优先扱调度 卄最短作业优先5=最短剌余时可fl诜 岔输人进程个数; 生输人此进程时间什大小|10输人第1个进程的名字、弋刖时间利优先级Irj

3、ja i请按任意键継绩一一一进程pi己经执行完毕输人第2个逵程的名宇“时间和优先级P2 1Q 2A-Z3. 优先级调度算法匾I C:Wi ndowsXsst?m3 Scrrd/exe3:优先級谯度 <:最短作业优先S:最J豆利余时间优先选择调度算法匚、1: FFS 2:时闾片轮捉 pAtt程个数::输入此进程时间片大小;10输入第1个进程的名字、P1 丄 0 2cpuB、r可和勺诜圾:输入第2个进程的名字"P2 10 1<ipu时可和式先级=输人第3个讲稈的名字“P3 10 3CJM0寸可曲忧先级=<说明;在本程序所列进程信息中,优先级一顶是指遗程运行后的优元级?!

4、 > 还需要占用时间谜程名字井需占用CPU时间优先级F3nP2伏态运仃请按任意键娃续一一P1P2P2P3P1亠竟 -I丁 ;;1 勺打 JT1-LL1 IEEP2'青按任意健绽续进程P2已经执行花毕!« 运彳亍4. 最短时间优先算法C:Wi 匚 ws'.syste m 3 2cmd. exe选择调度算法;斗 3=仿先级调度4:最忠作业优先5:最塩剰余时间优先cpu时间和及:1: FCFS 2:时IS片牡换 咗输入进程个数; :输入此进S时问片大小: 10输人第1个进程的名壬输入第2个进程的名字、P2 10 1cp 迪寸间和优先级=<说明二在本程JTO

5、9;ja程信恳中,优宠s-顼是指进程运行后的优先级?* > 进程名宇共需占用卩珂时间还需妾占用时间优元级状态1F)20R20P2P1请按任意键继续 + 进程re己经执行完毕?请按任苣键继绫匡行pi29运彳丁酋按任意犍继续.-请稈理m经执彳亍完毕tR青按任意键维续5. 最短剩余时间优先算法C:VZ r dovvsVyteriiS2 .cmc.exe请输入i-算机巾的进程敕印审入笫讨谜程的到囚姻及剩余执行旳间= 翳樂个进程的到达时阖及剩余执行时阊:1 4加入第工个避程的到达时间薜J余执行时间 备鳩说程的到妊时间及剩余执行时间=3 5进棍按顺隼运行依初为:13 4 13平均等待时间是;平均周转

6、时间是:13,080890请按任鳶键継续-实验总结在此次模拟过程中,将 SRTF单独拿了出来用指针表示,而其余均用数组表示。完整代码【Srtf.cpp代码如下:】/最短剩余时间优先算法的实现#include <stdio.h>#include <stdlib.h>#include <time.h> typedefstruct/进程剩余执行时间/进程到达时间/进入就绪队列的时间/进入执行队列的时间/进程执行结束的时间/进程编号/定义进程模块/定义一个进程模块队列中结点int remain_time;int arrive_time;int Tp;int Tc;i

7、nt To;int number;Process_Block;typedefstruct _QueueProcess_Block PB; struct _Queue *next;_Block,*Process;typedefstructProcess head;Process end;Process_Queue;Process_QueuePQ;intt;ProcessRun_Now;/队列头指针/队列尾指针/进程队列/定义一个全局队列变量/全局时间/当前正在运行的进程,作为全局变void lnitQueue(Process_Queue PQ)PQ.head ->next = NULL;P

8、Q.end ->next = PQ.head;/*初始化队列*/int IsEmpty(Process_Queue PQ)if(PQ.end->next = PQ.head)return 1;/队列空的条件为头指针指向尾指针并且尾指针指向头指针elsereturn 0;/*判定队列是否为空队列*/void EnQueue(Process_Queue PQ,Process P)Process temp =(Process)malloc( sizeof (_Block);temp = PQ.end;temp->next->next = P;PQ.end->next =

9、 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)/如果队列为空,返回if(!Run_Now)return NULL;el

10、sereturn Run_Now;Process temp,shortest,prev;int min_time;if(Run_Now)shortest = Run_Now;min_time = Run_Now->PB.remain_time;elseshortest = 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 <min_time

11、) 短,shortest = temp->next;min_time = shortest->PB.remain_time; prev=temp;temp=temp->next;if(shortest = PQ.end->next)PQ.end->next = prev;prev->next = shortest->next;return shortest;/*调度最短剩余时间的进程至队头*/void Run()Run_Now->PB.remain_time-;return ;/*运行函数*/void Wait()return ;/如果当前有进程

12、正在执行,/那么最短进程初始化为当前正在执行的进程,/如果当前没有进程执行,/则最短进程初始化为队列中第一个进程/如果当前进程的剩余时间比min_time/则保存当前进程,/及其前驱/如果最短剩余时间进程是队列中最后一个进程,/则需要修改尾指针指向其前驱/修改指针将最短剩余时间进程插入到队头/某一时间运行它的剩余时间减int sum( intarray , int n)int i,sum=O;for (i=0;i<n;i+)sum+= array i;return sum;int main()PQ.head= (Process)malloc(sizeof(_Block);PQ.end=

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

14、* sizeof (int );circle_t =( int *)malloc(N* sizeof (int);for (i=0;i<N;i+)Pi= (Process)malloc(sizeof (_Block);Pi->PB.number=i+1;Pi->next=NULL;wti=0;circle_ti=0;printf("输入第%d个进程的到达时间及剩余执行时间:n" ,i+1);scanf( "%d %d" ,&Pi->PB.arrive_time,&Pi->PB.remain_time);for

15、 (i=0;i<N;i+)Total_Time+=Pi->PB.remain_time;printf( "n进程按顺序运行依次为:n");i=0;int k=0;for (t=0;t+)if(Run_Now)/如果当前有进程正在执行Run();if (t = Pi->PB.arrive_time)/如果当前时间正好有进程进入if(Pi->PB.remain_time < Run_Now->PB.remain_time)temp = Pi;Pi = Run_Now;Run_Now = temp;/则调度它至运行队列中,Run_Now->

16、;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+;i=(i+1)>(N-1)?(N-1):(i+1);if (Run_Now->PB.remain_time = 0)时间NULL/如果当前进程运行结束,/进程运行结束的circle_tRun_Now->P

17、B.number-1 +=t-Run_Now->PB.arrive_time;free(Run_Now);/则将它所占资源释放掉,Run_Now =NULL;/ 并修改 Run_Now 为Run_Now->PB.To=t;Run_Now = ShortestProcess(PQ); /从就绪队列中调出最短剩余时间进程至队头, if(!Run_Now)/如果队列为空,转为等待状态if(lsEmpty(PQ) && k >= N) break ;Wait();continue ;elseRun_Now->PB.Tc=t;wtRun_Now->PB.nu

18、mber-1+=Run_Now->PB.Tc-Run_Now->PB.Tp;printf( "%d " ,Run_Now->PB.number);else/如果当前运行进程为空,那么if (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)

19、>(N-1)?(N-1):(i+1);elseWait();continue ;printf( "n");printf("平均等待时间是:n%fn" ,(float )sum(wt,N)/N);printf("平均周转时间是:n%fn" ,(float )sum(circle_t,N)/N);return 0;/【Process.cpp代码如下:】#include <iostream>#include <string> usingnamespace std;class Processpublic :str

20、ing ProcessName; / 进程名字int Time; / 进程需要时间int leval; / 进程优先级int LeftTime; /进程运行一段时间后还需要的时间;void Copy ( Process proc1, Process proc2); / 把proc2 赋值给 proc1void Sort( Processpr, int size) ; /此排序后按优先级从大到小排列void sort1(Processpr, int size) ; / 此排序后按需要的cpu时间从小到大排列void Fcfs( Process pr, int num, int Timepice)

21、; / 先来先服务算法void TimeTurn( Process process, int num, int Timepice); / 时间片轮转算法 void Priority( Process process, int num, int Timepice); / 优先级算法void main()int a;cout«endl;cout« " 选择调度算法:"vvendl;cout« " 1: FCFS 2:时间片轮换3:优先级调度4:最短作业优先 5:最短剩余时间优先"<<endl;cin>>a

22、;constint Size =30;Process processSize;int num;int TimePice;coutvv "输入进程个数:"vvendl;cin»num;coutvv "输入此进程时间片大小:"vvendl;cin»TimePice;for ( int i=0; iv num; i+)string name;int CpuTime;int Leval;coutvv "输入第"vv i+1vv "个进程的名字、cpu时间和优先级:"vvendl;cin»nam

23、e;cin>> CpuTime»Leval;processi.ProcessName =name;processi.Time =CpuTime;processi.leval =Leval;coutvvendl;for ( int k=0;kvnum;k+)processk.LeftTime=processk.Time ;/ 对进程剩余时间初始化coutvv "(说明:在本程序所列进程信息中,优先级一项是指进程运行后的优先级!!)";coutvvendl; coutvvendl;coutvv "进程名字"vv "共需占用CP

24、U时间"vv "还需要占用时间"vv "优先级"vv " 状态"vvendl;if(a=1)Fcfs(process,num,TimePice);elseif (a=2)TimeTurn( process, num, TimePice);elseif (a=3)Sort( process, num);Priority( process , num, TimePice);else /最短作业算法,先按时间从小到大排序,再调用Fcfs算法即可sort1(process,num);Fcfs(process,num,TimePice

25、); void Copy ( Process procl, Process proc2)procl .1 eval =proc2.1 eval ;procl.ProcessName =proc2.ProcessName ;proc1.Time =proc2.Time ;void Sort( Process pr, int size) / 以进程优先级高低排序/直接插入排序for ( int i=1;i<size;i+)Process temp;temp = pri;int j=i;while (j>0 && temp.leval<prj-1.leval)prj

26、 = prj-1;j-;prj = temp; /直接插入排序后进程按优先级从小到大排列for ( int d=size-1;d>size/2;d-)Process temp;temp=pr d;pr d = pr size-d-1;pr size-d-1=temp; /此排序后按优先级从大到小排列/*最短作业优先算法的实现*/void sort1 ( Process pr, int size) /以进程时间从低到高排序/直接插入排序for ( int i=1;i<size;i+)Process temp;temp = pri;int j=i;while (j>0 &

27、& temp.Time < prj-1.Time )prj = prj-1;j-;prj = temp;/* 先来先服务算法的实现*/void Fcfs( Process process, int num, int Timepice) / process 是输入的进程,num是进程的数目,Timepice是时间片大小while (true )if (num=0)coutvv "所有进程都已经执行完毕r' <<endl;exit(1);if (process0. LeftTime=O)coutvv "进程"vvprocess0.Pr

28、ocessNamevv "已经执行完毕 r' <<endl;for (int i=0;ivnum;i+)processi=processi+1;num-;elseif (processnum-1.LeftTime=0)coutvv "进程"vvprocessnum-1.ProcessNamevv "已经执行完毕 r' vvendl; num-;elsecoutvvendl;/输出正在运行的进程process0 .L eftTime=processO .L eftTime- Timepice;processO.leval =pr

29、ocess0.leval-1;coutvv "" vvprocess0.ProcessName vv "" vvprocess0.Time vv "" coutvvprocess0.LeftTime vv "" vvprocess0.levalvv " 运行" coutvvendl;for (int s=1;svnum;s+)coutvv "" vvprocesss.ProcessName vv "" vvprocesss.Time vv "&q

30、uot;coutvvprocesss.LeftTimevv "" vvprocesss.levalvv " 等待"vvendl;/ elsecout«endl;system( " pause");cout«endl; / while/*时间片轮转调度算法实现*/void TimeTurn( Process process, int num, int Timepice)while (true )if (num=0)coutvv "所有进程都已经执行完毕r' <<endl;exit(1);

31、if (process0. LeftTime=0)coutvv "进程"vvprocess0.ProcessNamevv "已经执行完毕 r' <<endl;for (int i=0;ivnum;i+)processi=processi+1;num-;if ( processnum-1.LeftTime =0 )coutvv "进程"vv processnum-1.ProcessName vv"已经执行完毕! " vvendl;num-;elseif (process0.LeftTime > 0)c

32、outvvendl;/输出正在运行的进程process0 .L eftTime=process0 .L eftTime- Timepice;process0.leval =process0.leval-1;coutvv "" vvprocess0.ProcessName vv "" vvprocess0.Time vv "" coutvvprocess0.LeftTime vv "" vvprocess0.levalvv " 运行" coutvvendl;for (int s=1;svnum;s

33、+)coutvv "" vvprocesss.ProcessName vv "" vvprocesss.Time vv ""coutvvprocesss.LeftTimevv "" vvprocesss.leval;if(s=1)coutvv "就绪"vvendl;elsecoutvv "等待"vvendl;Process temp;temp = process0;for ( int j=0;j<num;j+)processj = processj+1; processnum-1 = temp; / elsecout«endl;system( " pause");cout«endl; / while/*优先级调度算法的实现*/void Pri

温馨提示

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

评论

0/150

提交评论