操作系统实验报告-进程调度zzp_第1页
操作系统实验报告-进程调度zzp_第2页
操作系统实验报告-进程调度zzp_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、实验室名称:计算机实验室实验项目名称:进程调度班级: 物联网151沈阳工程学院学生实验报告实验课程名称:操作系统实验日期:2016年_月_日姓名: 学号指导教师: 曲乐声 刘琪 批阅教师:成绩:一. 实验目的本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解基于时间片轮转调度算法的具体实施办法。二. 实验设备PC机一台,WIN-TC 软件。三. 实验项目(1) 设计进程控制块 PCB的结构,通常应包括如下信息:进程名、或轮转时间片数、 进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、进程优先级、当前队列指针等(2) 编写调度算法程序:

2、时间片轮转、优先级调度算法程序(3) 按要求输出结果。(附图)四. 根据实验写结果1时间片轮转时间片大小进程名ABCDE平均q=4到达时间01234服务时间23456完成时间2591522周转时间24712188.6带权周转时间11.31.752.431.892优先级时间片大小进程名ABCDE平均q=4到达时间01234服务时间23456优先数12345完成时间211131820周转时间21011151610.8带权周转时间13.32.7532.62.5四.实验程序代码(附页)成绩评定算法正确性2.521.510.50程序正确性2.521.510.50结果及分析的正确性543210成绩时间片轮

3、转#in elude <stdio.h> #in elude <stdlib.h> #in elude <stri ng.h>typedef struct nodechar n ame20;/*进程的名字*/intprio; /*进程的优先级*/intround; /*分配CPU的时间片*/intcputime; /*CPU执行时间*/intneedtime; /*进程执行所需要的时间*/char state;/*进程的状态,W就绪态,执行态,F完成态*/int count; /*记录执行的次数*/struct node *n ext;/*链表指针*/PCB

4、;PCB *ready=NULL,*ru n=NULL,*fi nish=NULL; /* 定义三个队列,就绪队列,执行队列和完成队列*/int num;void GetFirst(); /*从就绪队列取得第一个节点*/void Output(); /*输出队列信息*/void In sertPrio(PCB *in); /*创建优先级队列,规定优先数越小,优先级越高*/时间片队列*/时间片队列*/void In sertTime(PCB *in); /* void In sertFi ni sh(PCB *in); /*void PrioCreate();/*优先级输入函数*/void Ti

5、meCreate();/*时间片输入函数*/void Priority(); /*按照优先级调度*/void Rou ndR un ();/*时间片轮转调度*/int main(void) char chose;printf(”输入进程名及其需要运行的时间n");scan f("%d", &n um);getchar();(P/R)n");prin tf("Scheduli ngmethod for in put process:scan f("%c",&chose);switch(chose)case &#

6、39;P':case 'p':PrioCreate();Priority。;break;case 'R':case 'r':TimeCreate();Rou ndRu n();break;default:break;Output。;return 0;void GetFirst() /*取得第一个就绪队列节点*/run = ready;if(ready!=NULL)run ->state = 'R'ready = ready ->n ext;run ->n ext = NULL;void Output。/*

7、输出队列信息*/PCB *p;p = ready;statetco un terprintf(”进程名 t prioritytnumber'tcputime'ttime you need tprocessn");while(p!=NULL)prin tf("%st%dt%dt%dt%dtt%ctt%dn",p-> name,p->prio,p->rou nd,p->cputime,p->n eedtime,p->state,p->co un t);p = p_>n ext;p = fin ish;wh

8、ile(p!=NULL)prin tf("%st%dt%dt%dt%dtt%ctt%dn",p-> name,p->prio,p->rou nd,p->cputime,p->n eedtime,p->state,p->co un t);p = p_>n ext;p = run;while(p!=NULL)prin tf("%st%dt%dt%dt%dtt%ctt%dn",p-> name,p->prio,p->rou nd,p->cputime,p->n eedtime,p-&

9、gt;state,p->co un t);p = p_>n ext;void In sertPrio(PCB *in)/*创建优先级队列,规定优先数越小,优先级越低*/PCB *fst,* nxt; fst = nxt = ready;if(ready = NULL) /*如果队列为空,则为第一个元素*/in->n ext = ready;ready = in;else /*查到合适的位置进行插入*/if(in ->prio >= fst _>prio) /*in->n ext = ready;ready = in;elsewhile(fst- >

10、;n ext != NULL) /*nxt = fst;fst = fst- >n ext;比第一个还要大,则插入到队头*/移动指针查找第一个别它小的元素的位置进行插入*/if(fst ->n ext = NULL) /*in ->n ext = fst ->n ext;fst ->n ext = in;已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/else /* 插入到队列中*/n xt = in;in ->n ext = fst;void In sertTime(PCB *in) /*将进程插入到就绪队列尾部*/PCB *fst;fst = r

11、eady;if(ready = NULL)in->n ext = ready;ready = in;elsewhile(fst-> next != NULL)fst = fst->n ext;in ->next = fst ->n ext;fst ->n ext = in;void In sertFi ni sh(PCB *in) /*将进程插入到完成队列尾部*/PCB *fst;fst = fini sh;if(fin ish = NULL)in->n ext = finish;fin ish = in;elsewhile(fst-> next

12、 != NULL)fst = fst->n ext;in ->next = fst ->n ext;fst ->n ext = in;void PrioCreate() /*优先级调度输入函数*/PCB *tmp;int i;required:' n");prin tf("E nterthe process n ame and process timefor(i = 0;i < num; i+)if(tmp = (PCB *)malloc(sizeof(PCB)=NULL)perror("malloc");exit(

13、1);sca nf("%s",tmp->n ame);getchar(); /*吸收回车符号*/sca nf("%d",&( tmp-> needtime);tmp ->cputime = 0;tmp ->state =W;tmp ->prio = 50 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低*/tmp ->round = 0;tmp ->co unt = 0;In sertPrio(tmp); /*按照优先级从高到低,插入到就绪队列*/void TimeCr

14、eate()/*时间片输入函数 */PCB *tmp;int i;slice:nprintf("Enterthe process name and the time required for the process time");for(i = 0;i < num; i+)if(tmp = (PCB *)malloc(sizeof(PCB)=NULL)perror("malloc");exit(1);sca nf("%s",tmp->n ame);getchar();sca nf("%d",&(

15、 tmp-> needtime);tmp ->cputime = 0;tmp ->state =W;tmp ->prio = 0;tmp ->rou nd = 2; /*假设每个进程所分配的时间片是 2*/tmp ->co unt = 0;In sertTime(tmp);void Priority() /*按照优先级调度,每次执行一个时间片 */int flag = 1;GetFirst();while(run != NULL) /*当就绪队列不为空时,则调度进程如执行队列执行*/Output。; /*while(flag)输出每次调度过程中各个节点的状态

16、*/run->prio -= 3; /*优先级减去三*/run->cputime+; /*CPU时间片加一 */run->n eedtime-;/*进程执行完成的剩余时间减一*/if(run->n eedtime = 0)/*如果进程执行完毕,将进程状态置为F将其插入到完成队列*/进程执行的次数加一*/run ->state = 'F' run->co un t+; /* InsertFini sh(r un);flag = 0;else /*将进程状态置为W,入就绪队列*/run->state = 'W;进程执行的次数加一*/

17、run->co un t+; /*In sertTime(ru n);flag = 0;flag = 1;GetFirst(); /*继续取就绪队列队头进程进入执行队列*/int flag = 1;GetFirst();while(run != NULL)Output。;while(flag)run->co un t+;run->cputime+;run->n eedtime-;if(run->needtime = 0) /*进程执行完毕 */run ->state = 'F'InsertFini sh(r un);flag = 0;else

18、 if(run->count = run->round)/*时间片用完 */run->state = 'W;run->cou nt = 0; /*计数器清零,为下次做准备*/In sertTime(ru n);flag = 0;flag = 1;GetFirst();FF3sb Anyto cant inuewFF3bbccAH进程名cc bb占用CPU时间到宪成还裁旳时间轮转时间片状态A40R进程名CC bb aa进程呂CC bb aa占用GPU时间到完咸还蒙的时间轮转时阿片状态313»3B3F占用CFU时冋到芫成还爰的叶间轮转时间片状态6-2&am

19、p;FFF片名占用CPU3t|B|到充咸还要的时间轮转时间片 状态00优先级#in elude<stdio.h>#in elude<stdlib.h>#in elude<coni o.h>#defi negetpeh(type) (type*)malloc(sizeof(type)#defineNULL 0struct pcb char n ame10;char state;int super;int ntime;int rtime;struct pcb* link;*ready=NULL,*p;typedef struct pcb PCB;void sor

20、t() PCB *first,*second;int insert=0;if(ready=NULL)|(p_>super)>(ready_>super)p->li nk=ready;ready=p;else /*进程比较优先级,插入适当的位置中*/first=ready;sec on d=first->li nk;while(sec on d!=NULL)if(p->super)>(second->super)/*若插入进程比当前进程优先数大*/ /*插入到当前进程前面*/p->li nk=sec ond;first->li nk=p

21、;seco nd=NULL;in sert=1;else /*插入进程优先数最低,则插入到队尾*/first=first->li nk;sec on d=sec on d->li nk;if(in sert=0)first->li nk=p;voidin put()/*建立进程控制块函数*/ int i,num;system("cls"); /* 清屏 */printf("nprint the numberof the process: ");sca nf("%d",&n um);for(i=1;i<=

22、nu m;i+)prin tf("nprocess No.%d:n",i);p=getpch(PCB);printf("nprint the name of process:");sca nf("%s",p->n ame);prin tf("nprint the priority:");sca nf("%d",&p->super);printf("nprint the time of process:");sca nf("%d",&am

23、p;p->n time);prin tf("n");p_>rtime=0;p_>state=W;p->li nk=NULL;sort(); /* 调用 sort 函数 */int space()int l=0;PCB* pr=ready;while(pr!=NULL)l+;pr=pr->li nk;return(l);void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/prin tf("nprocess n amet state't priority'tn eed timet run ti

24、me' n");prin tf("|%st",pr- >n ame);prin tf("|%ct",pr->state);prin tf("|%dt",pr->super);prin tf("|%dtt",pr- >n time);prin tf("|%dt",pr->rtime);prin tf("n");void check() /* 建立进程查看函数*/PCB* pr;printf("n* the process is running:n");/* 显示当前运行进程 */disp(p);pr=ready;printf("n* the state:n");/* 显示就绪队列状态 */while(pr!=NULL)disp(pr);pr=pr->li nk; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/printf("nthe process%s is running.n",p->name);fr

温馨提示

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

评论

0/150

提交评论