《操作系统》实验指导书2017 下载本文

p=(PCB *)malloc(sizeof(PCB)); scanf(\ scanf(\ strcpy(p->name,na); p->cputime=0; p->needtime=time; p->state='W'; p->prio=50-time;

if(ready!=NULL) /*就绪队列不空则调用插入函数插入*/ insert1(p); else {

p->next=ready; /*创建就绪队列的第一个PCB*/ ready=p; } } void clrscr(void);

printf(\ 优先级调度算法模拟输出结果:\\n\ printf(\\ prt(alg); /*输出进程PCB信息*/ run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready->next; run->state='R'; }

/*****轮转法创建进程PCB*****/ void create2(char alg) { PCB *p; int i,time; char na[10]; ready=NULL; finish=NULL; run=NULL; printf(\请输入进程的名字和运行所需要的时间\\n\ for(i=1;i<=N;i++) { p=(PCB *)malloc(sizeof(PCB)); scanf(\ scanf(\ strcpy(p->name,na); p->cputime=0; p->needtime=time;

p->count=0; /*计数器*/ p->state='W'; p->round=2; /*时间片*/ if(ready!=NULL) insert2(p); else { p->next=ready; ready=p; tail=p; } } void clrscr(void);

printf(\ 时间片轮转法模拟输出结果:\\n\ printf(\n\ }

prt(alg); /*输出进程PCB信息*/

run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready->next; run->state='R';

/*****先来先服务算法创建PCB*****/ void create3(char alg) { PCB *p; int i;

ready=NULL; run=NULL; finish=NULL;

printf(\请输入进程的名字、到达时间和运行所需要的时间\\n\ for(i=0;i

p=(PCB *)malloc(sizeof(PCB)); scanf(\ scanf(\ scanf(\ p->starttime=0; p->finishtime=0; p->turnaroundtime=0; p->weightedturnaroundtime=0; p->state='W'; if(ready!=NULL) insert3(p);

else { p->next=ready; ready=p; } } void clrscr(void); printf(\ 先来先服务算法模拟输出结果:\\n\ printf(\******\\n\ prt(alg); }

run=ready; /*将就绪队列的第一个进程投入运行*/ ready=ready->next; run->state='R';

/*****优先数调度算法*****/ void priority(char alg) {

while(run!=NULL) /*当运行队列不空时,有进程正在运行*/ {

run->cputime=run->cputime+1; run->needtime=run->needtime-1;

run->prio=run->prio-3; /*每运行一次优先数降低3个单位*/ if(run->needtime==0) /*如所需时间为0将其插入完成队列*/ {

run->next=finish; finish=run;

run->state='F'; /*置状态为完成态*/ run=NULL; /*运行队列头指针为空*/ if(ready!=NULL) /*如果就绪队列不空*/

firstin(); /*将就绪对列的第一个进程投入运行*/ }

else /*没有运行完同时优先数不是最大,则将其变为就绪态插入到就绪队列*/ if((ready!=NULL)&&(run->prioprio)) {

run->state='W'; insert1(run);

firstin(); /*将就绪队列的第一个进程投入运行*/ }

prt(alg); /*输出进程PCB信息*/ } }

/*****时间片轮转法*****/

void roundrun(char alg) {

while(run!=NULL) {

run->cputime=run->cputime+1; run->needtime=run->needtime-1; run->count=run->count+1;

if(run->needtime==0)/*运行完将其变为完成态,插入完成队列*/ {

run->next=finish; finish=run; run->state='F'; run=NULL;

if(ready!=NULL)

firstin(); /*就绪对列不空,将第一个进程投入运行*/ } else

if(run->count==run->round) /*如果时间片到*/ {

run->count=0; /*计数器置0*/

if(ready!=NULL) /*如就绪队列不空*/ {

run->state='W'; /*将进程插入到就绪队列中等待轮转*/ insert2(run);

firstin(); /*将就绪对列的第一个进程投入运行*/ } } } }

prt(alg); /*输出进程信息*/

/*****先来先服务调度算法*****/ void FIFO(char alg) { int time; while(run!=NULL) { time=run->arrivetime>time?run->arrivetime:time; run->starttime=time; time=time+run->servicetime; run->finishtime=time; run->turnaroundtime=run->finishtime-run->arrivetime; run->weightedturnaroundtime=run->turnaroundtime/run->servicetime; run->next=finish; finish=run; run->state='F';