操作系统-进程调度实验(共23页).docx

上传人:飞****2 文档编号:5210458 上传时间:2021-12-12 格式:DOCX 页数:23 大小:402.48KB
返回 下载 相关 举报
操作系统-进程调度实验(共23页).docx_第1页
第1页 / 共23页
操作系统-进程调度实验(共23页).docx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

《操作系统-进程调度实验(共23页).docx》由会员分享,可在线阅读,更多相关《操作系统-进程调度实验(共23页).docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、;void PRINTLINK(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!=NU

3、LL) printf("%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"

5、;); getchar(); 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("

6、优先数:");scanf("%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("需要的运行时间:&quo

7、t;); scanf("%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=(str

8、uct pcb* )malloc(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-

9、>next; strcpy(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=

10、CPCBLINK();/*建立就绪队列*/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->cputim

11、e=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+;void S

12、JP()/*调用时间片循环轮转算法*/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;

13、ct=ct+2; p->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;

14、 RUN=NULL; t+;/*主程序*/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"); pr

15、intf(" 3:退出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; /

17、*进程标识符*/int cputime; /*进程占用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还需要运行

18、次数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("%st就绪t%dt%dn",p->name,p->cputime,p->needtime); p=p->next; else printf("*就绪队列为空n");p=FI

19、NSH;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("*完成队列为空n");getchar();PCB *CPCBLINK()/*建立就绪队列*/ printf("建立就绪队列nn");int i,n,nt,pr;PCB *p,*q,*head;n=0;while(1)

20、 printf("请输入进程的个数(有效范围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);wh

21、ile(1) printf("需要的运行时间:"); 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&

22、lt;n;i+) printf("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-&g

23、t;cputime=0;/*进程已获得的运行时间*/ 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=NUL

24、L; 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=p; PRINTLINK(t);/*输出3个队列*/ if( RUN->needtime<=0)/*若运行结束进入完成队列*/ if (FINSH=NULL)/*第1次进入完成队列*/ FINSH=p; FTAIL=p; else FTAIL->next=p; FTAIL=FTAIL->ne

25、xt; RUN=NULL; else/*若运行没结束进入就绪队列*/ if (READY=NULL)/*当就绪队列为空*/ READY=p; RTAIL=p; else RTAIL->next=p; RTAIL=p; RUN=NULL; t+;/*主程序*/void 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("进程

26、调度算法演示程序 n");printf("=n"); printf(" 1:调度算法n"); printf(" 2:退出n"); printf("n"); printf(" 请选择:"); scanf("%d",&N);if(N=1) SJP();/*调用时间片循环轮转算法*/else if(N=2) break; elseprintf("您输入的信息有误,请重新输入!nn");getchar();printf("演示程序结束!nn"); getchar();专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁