1、 char state; /*进程状态*/ int super; /*优先数*/ int ntime; /*需要运行的时间*/ int rtime; /*已占用的CPU时间*/ struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; /*pcb表*/ sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else
2、/* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else /* 插入进程优先数最低,则插入到队尾*/ first=first- second=second- if(insert=0) first- input() /* 建立进程控制块函数*/ int i,num; clrscr(); /
3、*清屏*/ printf(n 请输入进程号?); scanf(%d,&num); for(i=0;iname); printf(n 输入进程优先数: scanf(p-super);n 输入进程运行时间:ntime); p-rtime=0;state=w;link=NULL; sort(); /* 调用sort函数*/ int space() int l=0; PCB* pr=ready; while(pr! l+; pr=pr- return(l); disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t nd
4、time t runtime n|%st,pr-|%ctstate);|%dt printf(rtime); check() /* 建立进程查看函数,检查等待队列的进程是否进入就绪队列*/ PCB* pr;n * 当前正在运行的进程是: /*显示当前运行进程*/ disp(p); pr=ready;n *当前就绪队列状态为: /*显示就绪队列状态*/ while(pr! disp(pr);destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n free(p); running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
5、(p-rtime)+; if(p-rtime=p-ntime) destroy(); /* 调用destroy函数*/ else (p-super)-; /*调用sort函数*/ main() /*主函数*/ int len, h=0; char ch; input(); len=space(); while(len!=0)&(ready!=NULL) ch=getchar(); h+;n The execute number:%d n,h); p=ready; ready=p-R check(); running();n 按任一键继续. ch=getchar();nn 进程已经完成.n ch
6、=getchar(); 3、运行结果:请输入进程号?5进程号No.0:输入进程名:A输入进程优先数:2输入进程运行时间:1进程号No.1:B3进程号No.2:C进程号No.3:D4进程号No.4:EThe execute number:*当前正在运行的进程是:Qname state super ndtime runtimeE R 5 1 0*当前就绪队列状态为:D w 4 1 0B w 3 1 0A w 2 1 0C w 1 1 0进程E已完成按任一键继续D R 4 1 0进程D已完成B R 3 1 0进程B已完成A R 2 1 0进程A已完成cc R 1 1 0进程C已完成进程已经完成(二)
7、、简单轮转法在分时系统中,都毫无例外采用时间片轮转法。在一种简单的轮转法中,系统将所有就绪进程按FIFO规则排成一个队列,把CPU分配给队首进程,并规定它执行一给定的时间如100ms,称此时间间隔为时间片。当时间片完成时,系统产生一个时钟中断,剥夺该进程的执行,将它送至就绪队列的末尾,并把处理机分配给就绪队列的新队首进程,同样也让它执行一个时间片。这样,就绪队列中的所有进程均可获得一个时间片的处理机而运行。就绪队列中的进程在依次执行时,可能发生以下三种情况:(1)进程未用完一个时间片就结束,这时系统应提前调度;(2)进程在执行过程中提出I/O请求而阻塞,系统应将它放入相应的阻塞队列并引起调度;
8、(3)进程完成一个时间片后尚未完成,系统应将它重新放到就绪队列的末尾,等待下次执行。由于在分时系统中,键盘命令的执行时间较短,大多能在一个时间片内执行完毕,因此分时系统的实际响应时间将比Nq(N是同时性用户数,q是时间片大小)小。#include/*定义一个pcb的结构体*/struct pcb char name; /*进程名*/int time; /*进程执行时间*/;void main() int n,i,j,flag=1;struct pcb a100; /*最多可以有100个进程*/printf(输入进程 个数:scanf(n);getchar();/*接收回车*/ for(i=0;
9、n; printf(输入进程的名字:%cai.name); /*以字符接收进程名*/输入占用的时间片: /*输入进程占用的时间片*/ai.time); i=0;while(flag & n0) /*若进程数为空,结束程序*/ if(ai.time!=0) /*就绪队列是否为空*/,ai.name); /*进程执行一次,打印出该进程*/ai.time-; /*使该进程占用的时间片减1*/for(j=0;jW if(head=NULL) head=q=p; else q- q=p; void print(JCB *pr,int m)JCB *p; printf(ntime=%d,time); if
10、(m=3) printf(n作业名t状态t到达时间t服务时间t优先权tt完成时间t周转时间t带权周转时间n%st%ct%dt%dt%4.2ft%dt%4.2ft%4.2fn, pr-name,pr-state,pr-ts,pr-ntime,pr-super,pr-tc,pr-ti,pr-wi); else printf(n作业名 状态 到达时间 服务时间 完成时间 周转时间 带权周转时间n%st%ct%dt%dt%dt%4.2ft%4.2fn p=head; do if(p-state=)%st%ct%dt%dt%4.2fnname,p-state,p-ts,p-ntime,p- else p
11、rintf(%st%ct%dt%dn p=p- while(p!=NULL);F if(m=3)super,p-tc,p-ti,p- elseprintf(void last()eti/=n;ewi/=n;n平均周转时间%7.3fn平均带权周转时间=%7.3fn,eti,ewi);super()JCB *padv;padv=head;do if(padv-padv-tssuper=(float)(time-padv-ts+padv-ntime)/padv-ntime; padv=padv-while(padv!void hrn(m)JCB *min;int i,iden;i+)p=min=head;iden=1; super(); doif(p- if(iden) min=p;iden=0; else if(p-supermin-super) min=p; if(iden) i-;time+; if(time1000)printf(nruntime is too long.error.getch(); else running(min,m);void sjf(int m) JCB *min; int i,iden; for(i=0;i+) p=min=head;ntimentime) min=p; wh
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1