操作系统进程调度实验_第1页
操作系统进程调度实验_第2页
操作系统进程调度实验_第3页
操作系统进程调度实验_第4页
操作系统进程调度实验_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、实验五 进程调度模拟实验/进程调度算法proc.c#include <stdio.h>#include<stdlib.h>#include <string.h>typedef struct pcb/定义PCB结构char name20; /*进程标识符*/int cputime; /*进程占用CPU时间*/int prio; /*进程优先数*/int needtime; /*进程到完成还需要的CPU时间*/struct pcb *next;/*链指针*/PCB;PCB *RUN,*READY,*RTAIL,*FINSH,*FTAIL;void PRINTLI

2、NK(int t)/*输出3个队列*/PCB *p;printf("CPU运行次数:_%d_n",t);printf("_n");printf("进程名t运行状态t运行次数t还需要运行次数n");if(RUN!=NULL) printf("%st运行t%dt%dn",RUN->name,RUN->cputime,RUN->needtime); else printf("*运行状态为空n");p=READY;if(p!=NULL) while(p!=NULL) printf(&q

3、uot;%st就绪t%dt%dn",p->name,p->cputime,p->needtime); p=p->next; else printf("*就绪队列为空n");p=FINSH;if (p!=NULL) while(p!=NULL)/printf(" 进程名字为:%sn",p->name);printf("%st完成t%dt%dn",p->name,p->cputime,p->needtime);p=p->next;elseprintf("*完成队列为

4、空n");getchar();PCB *CPCBLINK()/*建立就绪队列*/ printf("建立就绪队列nn");int i,n,nt,pr;PCB *p,*q,*head;n=0;while(1) printf("请输入进程的个数(有效范围1-100):"); scanf("%d",&n); printf("n"); if (n>=1&&n<=100) break; else printf("输入有误。请重新输入!n"); getchar()

5、; head=(struct pcb* )malloc(sizeof(struct pcb);printf("输入第1个进程的名称:");scanf("%s",head->name);while(1) printf("需要的运行时间:"); scanf("%d",&nt); if(nt>0) break; else printf("输入无效,重新输入!n"); getchar(); head->needtime=nt;printf("优先数:");s

6、canf("%d",&pr);head->prio=pr; head->cputime=0;/*进程已获得的运行时间*/head->next=NULL;q=head; for(i=1;i<n;i+) printf("n");p=(struct pcb* )malloc(sizeof(struct pcb); printf("输入第%d进程的名称:",i+1); scanf("%s",p->name); printf("需要的运行时间:"); scanf(&q

7、uot;%d",&nt); p->needtime=nt; printf("优先数:"); scanf("%d",&pr); p->prio=pr;p->cputime=0;/*进程已获得的运行时间*/ p->next=NULL;q->next=p;q=p; RTAIL=q;return head;void JXDLPX()/*就绪队列按优先级从大到小排序*/ PCB *p,*q,*t; char s10; int L=0,ct,pr,nt; p=READY; t=(struct pcb* )mal

8、loc(sizeof(struct pcb); while(p->next!=NULL) L=0; q=p->next; t=p; while(q!=NULL) if(t->prio<q->prio) t=q; L=1;/*表示有比它优先级大的进程*/ q=q->next; if(L=1) strcpy(s,t->name); ct=t->cputime; pr=t->prio; nt=t->needtime; q=p->next; while(strcmp(q->name,s)!=0) q=q->next; str

9、cpy(q->name,p->name); q->cputime=p->cputime; q->prio=p->prio; q->needtime=p->needtime; strcpy(p->name,s); p->cputime=ct; p->prio=pr; p->needtime=nt; p=p->next; void YXS()/*调用优先数调度算法*/PCB *p;int t=0,nt,ct,pr;printf("您选择的是:优先级调度算法n");READY=CPCBLINK();/*

10、建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);while(READY!=NULL) JXDLPX();/*就绪队列按优先级从大到小排序*/ p=READY; READY=READY->next; p->next=NULL; pr=p->prio; pr=pr-3; p->prio=pr;/*运行1次进程优先级缩小3*/ nt= p->needtime; nt=nt-1; p->needtime=nt; ct=p->cputime; ct=ct+1; p->cputime=ct; RUN=p;

11、PRINTLINK(t);/*输出3个队列*/ if( RUN->needtime<=0)/*若运行结束进入完成队列*/ if (FINSH=NULL)/*第1次进入完成队列*/ FINSH=p; FTAIL=p; else FTAIL->next=p; FTAIL=FTAIL->next; RUN=NULL; else /*若运行没结束进入就绪队列*/ if (READY=NULL)/*当就绪队列为空*/ READY=p; RTAIL=p; else RTAIL->next=p; RTAIL=p; RUN=NULL; t+;void SJP()/*调用时间片循环

12、轮转算法*/PCB *p;printf("您选择的是:时间片循环轮转调度算法n"); int t=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);while(READY!=NULL) p=READY; READY=READY->next; p->next=NULL; nt= p->needtime; nt=nt-2; if(nt<0) nt=0; p->needtime=nt; ct=p->cputime; ct=ct+2; p-&g

13、t;cputime=ct; RUN=p; PRINTLINK(t);/*输出3个队列*/ if( RUN->needtime<=0)/*若运行结束进入完成队列*/ if (FINSH=NULL)/*第1次进入完成队列*/ FINSH=p; FTAIL=p; else FTAIL->next=p; FTAIL=FTAIL->next; RUN=NULL; else/*若运行没结束进入就绪队列*/ if (READY=NULL)/*当就绪队列为空*/ READY=p; RTAIL=p; else RTAIL->next=p; RTAIL=p; RUN=NULL; t+

14、;/*主程序*/int main() int N;RUN=(struct pcb* )malloc(sizeof(struct pcb); while(1)RUN =NULL; READY =NULL; RTAIL=NULL; FINSH=NULL; FTAIL=NULL;printf("=n");printf("进程调度算法演示程序 n");printf("=n"); printf(" 1:优先级调度算法n"); printf(" 2:时间片循环轮转算法n"); printf(" 3

15、:退出n"); printf("n"); printf(" 请选择:"); scanf("%d",&N);if(N=1)YXS();/*调用优先数调度算法*/else if(N=2)SJP();/*调用时间片循环轮转算法*/else if(N=3) break; elseprintf("您输入的信息有误,请重新输入!nn");getchar();printf("演示程序结束!nn"); getchar();return 0;1、 流程图2、 实验结果3、 编写简化的多级反馈队列

16、调度算法要求只有三级队列,进程在第一级队列中时,采用时间片轮转执行;如果该进程没有执行完毕,其进入第二级队列,第二级队列中也采用时间片轮转算法,但时间片长度是第一级队列时间片长度的二倍,以此类推,长进程在第三级队列中最终执行完毕。如果进程在第一级队列中就已经执行完毕,则在第一级队列中结束进程,如在第二级队列中执行完毕,则在第二级队列中结束进程。 #include <stdio.h>#include<stdlib.h>#include <string.h>typedef struct pcb/定义PCB结构char name20; /*进程标识符*/int c

17、putime; /*进程占用CPU时间*/int prio; /*进程优先数*/int needtime; /*进程到完成还需要的CPU时间*/struct pcb *next;/*链指针*/ int ltime; /*时间片长度*/PCB;PCB *RUN,*READY,*RTAIL,*FINSH,*FTAIL;void PRINTLINK(int t)/*输出3个队列*/PCB *p;printf("CPU运行次数:_%d_n",t);printf("_n");printf("进程名t运行状态t运行次数t还需要运行次数n");if

18、(RUN!=NULL) printf("%st运行t%dt%dn",RUN->name,RUN->cputime,RUN->needtime); else printf("*运行状态为空n");p=READY;if(p!=NULL) while(p!=NULL) printf("%st就绪t%dt%dn",p->name,p->cputime,p->needtime); p=p->next; else printf("*就绪队列为空n");p=FINSH;if (p!=NU

19、LL) while(p!=NULL)/printf(" 进程名字为:%sn",p->name);printf("%st完成t%dt%dn",p->name,p->cputime,p->needtime);p=p->next;elseprintf("*完成队列为空n");getchar();PCB *CPCBLINK()/*建立就绪队列*/ printf("建立就绪队列nn");int i,n,nt,pr;PCB *p,*q,*head;n=0;while(1) printf("

20、;请输入进程的个数(有效范围1-100):"); scanf("%d",&n); printf("n"); if (n>=1&&n<=100) break; else printf("输入有误。请重新输入!n"); getchar(); head=(struct pcb* )malloc(sizeof(struct pcb);printf("输入第1个进程的名称:");scanf("%s",head->name);while(1) printf

21、("需要的运行时间:"); scanf("%d",&nt); if(nt>0) break; else printf("输入无效,重新输入!n"); getchar(); head->needtime=nt;printf("优先数:");scanf("%d",&pr);head->prio=pr; head->cputime=0;/*进程已获得的运行时间*/head->next=NULL;q=head; for(i=1;i<n;i+) prin

22、tf("n");p=(struct pcb* )malloc(sizeof(struct pcb); printf("输入第%d进程的名称:",i+1); scanf("%s",p->name); printf("需要的运行时间:"); scanf("%d",&nt); p->needtime=nt; printf("优先数:"); scanf("%d",&pr); p->prio=pr;p->cputime=0;/

23、*进程已获得的运行时间*/ p->next=NULL;q->next=p;q=p; RTAIL=q;return head;void SJP()/*调用时间片循环轮转算法*/PCB *p;printf("您选择的是:时间片循环轮转调度算法n"); int t=0,nt,ct;READY=CPCBLINK();/*建立就绪队列*/p=(struct pcb* )malloc(sizeof(struct pcb);while(READY!=NULL) p=READY; READY=READY->next; p->next=NULL; nt= p->needtime; nt=nt-ltime; if(nt<0) nt=0; p->needtime=nt; ct=p->cputime; ct=ct+ltime; p->cputime=ct; p->ltime*=2; RUN

温馨提示

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

评论

0/150

提交评论