进程模拟调度算法课程设计(2)

2019-05-17 17:41

}

scanf(\ /*输入进程名*/

scanf(\ /*输入进程要求运行时间*/ scanf(\ //输入进程开始时间

p->cputime=0;

p->state='W'; /*表示就绪队列中未在队首先执行,但也是就绪状态*/ if (ready!=NULL) insert(p); /*就绪队首不为NULL,插入新进程*/ else

{ /*否则先插在NULL前*/

p->next=ready; ready=p; }

}

printf(\ Display is going to start: \\n\printf(\print();

getchar();

run=ready; /*队列排好,run指向就绪队列队首*/ ready=ready->next; /*ready指向下一个进程*/ run->state='R'; /*队首进程的状态为就绪*/

void FCFS() { while(run != NULL) { }

void main()

{ printf(\ scanf(\

}

run->cputime=run->cputime+run->needtime; run->needtime=0; run->next=finish; finish = run; run->state='E'; run = NULL;

if(ready != NULL) { } print();

run = ready; run->state='R';

ready=ready->next;

}

create(); /*模拟创建进程,并输入相关信息*/ FCFS(); /*先来先服务调度算法*/

2.1.4.测试结果及说明

首先输入进程个数(为5个),这里命名为A,B,C,D,E,然后分别输入运行时间和开始时间

所有进程都在队列中,并都处于等待状态

其中一个进程执行完毕

所有进程都执行完毕

2.2.优先级调度

2.2.1.算法思想

进程的执行顺序由高优先级到低优先级,系统或用户按某种原则为进程指定

一个优先级来表示该进程所享有的确调度优先权。该算法核心是确定进程的优先级。

2.2.2.算法流程图

图2.优先级调度流程图

2.2.3.程序代码

#include #include #include typedef struct node

{ char name[10]; /*进程名*/ int prio; /*优先数*/

int cputime; /*占用cpu时间*/ int needtime; /*要求运行时间*/ char state; /*状态*/ struct node *next; /*指针*/ }PCB;

PCB *ready,*run,*finish; /*就绪 执行 结束指针*/ int N;

void prt() /*输出函数,可以方便看到进程执行的演示*/ {

PCB *p;

printf(\

if(run!=NULL)

printf(\time,run->prio,run->state); /*输出执行的进程的信息*/ p=ready;

while(p!=NULL)

{printf(\p->prio,p->state); /*输出就绪进程的信息*/ p=p->next; } p=finish; while(p!=NULL)

{ printf(\e,p->prio,p->state); /*输出结束队列的信息*/ p=p->next; }

getchar(); } /*使用getchar()函数可以让输出时停留画面,等待人按回车继续*/

void insert(PCB *q) /*插入新进程,把进程按优先数大小排序*/ { PCB *p1,*s,*r; int b;

s=q; /*指针s指向新要插入的进程*/

p1=ready; /*指针p1指向原来的进程队列的队首*/ r=p1; /*使用指针r是指向p1前面的进程*/ b=1;

while((p1!=NULL)&&b)

if(p1->prio>=s->prio) { r=p1; p1=p1->next; } /*新进程的优先数小,则p1 指向下一个进程继续比*/

else b=0;

if(r!=p1) { r->next=s; s->next=p1; } /*新进程找到位置,插在r和p1之间*/

else { s->next=p1; ready=s; } } /*新进程的优先数最大,插在队首,并

修改就绪队首ready指针*/

void create() { PCB *p; int i;

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

printf(\/*输入进程名、运行时间和优先级*/

for(i=0;i

{ p=(PCB *)malloc(sizeof(PCB)); /*为新进程开辟空间*/ scanf(\输入进程名*/

scanf(\输入进程要求运行时间*/ scanf(\输入进程优先数*/ p->cputime=0;

p->state='W'; /*表示就绪队列中未在队首先执行,但也是就绪状态*/

if (ready!=NULL) insert(p); /*就绪队首不为NULL,插入新进程*/

else { p->next=ready; ready=p; } } /*否则先插在NULL前*/ printf(\ printf(\ prt();

run=ready; /*队列排好,run指向就绪队列队首*/

ready=ready->next; /*ready指向下一个进程,这样当进程执行时如果优先数小于其他的进程,应该先进行优先数最大的进程*/ run->state='R'; } /*队首进程的状态为就绪*/ void prio()

{ while(run!=NULL)

{ run->cputime=run->cputime+1; /*运行一次cpu占用时间加一*/ run->needtime=run->needtime-1; /*运行一次要求运行时间减一*/ run->prio=run->prio-1; /*运行一次优先数减一*/ if(run->needtime==0) /*若要求运行时间为0时*/ { run->next=finish; /*退出队列*/

finish=run; /*finish为结束进程的队列 */ run->state='E'; /*修改状态为结束*/ run=NULL; /*释放run指针*/

if (ready!=NULL) /*创建新就绪队列的头指针*/ { run=ready; run->state='R'; ready=ready->next; } } else

if((ready!=NULL)&&(run->prioprio))

/*队首进程的优先数比它下一个小,且下一个进程不为NULL时执行*/ { run->state='W';

run->next=NULL; /*队首进程退出进程队列*/

insert(run); /*在进程队列中重新插入原来的队首进程*/ run=ready; /*重新置就绪队列的头指针*/ run->state='R';

ready=ready->next; } prt(); } } void main()

{ printf(\ scanf(\

create(); /*模拟创建进程,并输入相关信息*/ prio(); } /*优先数调度算法*/


进程模拟调度算法课程设计(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:实验二光纤干涉仪实验

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: