时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx

上传人:b****4 文档编号:6869033 上传时间:2023-05-07 格式:DOCX 页数:14 大小:48.94KB
下载 相关 举报
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第1页
第1页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第2页
第2页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第3页
第3页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第4页
第4页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第5页
第5页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第6页
第6页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第7页
第7页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第8页
第8页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第9页
第9页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第10页
第10页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第11页
第11页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第12页
第12页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第13页
第13页 / 共14页
时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx

《时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx》由会员分享,可在线阅读,更多相关《时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。

时间片轮转算法和优先级调度算法C语言模拟实现收藏Word文档格式.docx

TAIL——就需队列尾指针

FINISH——完成队列头指针

(3)程序说明

1.在优先数算法中,进程优先数的初值设为:

50-NEEDTIME

每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。

在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。

2.程序的模块结构提示如下:

整个程序可由主程序和如下7个过程组成:

(1)INSERT1——在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;

(2)INSERT2——在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;

(3)FIRSTIN——调度就绪队列的第一个进程投入运行;

(4)PRINT——显示每执行一次后所有进程的状态及有关信息。

(5)CREATE——创建新进程,并将它的PCB插入就绪队列;

(6)PRISCH——按优先数算法调度进程;

(7)ROUNDSCH——按时间片轮转法调度进程。

主程序定义PCB结构和其他有关变量。

(4)运行和显示

程序开始运行后,首先提示:

请用户选择算法,输入进程名和相应的NEEDTIME值。

每次显示结果均为如下5个字段:

1.在state字段中,代表执行态,,,W,代表就绪(等待)态F”代表完成态。

2.应先显示"

R"

态的,再显示态的,再显示"

F"

态的。

3.在"

VT态中,以优先数高低或轮转顺序排队;

在"

F”态中,以完成先后顺序排队。

viewplaincopytoclipboardprint?

1./*

2.操作系统实验之时间片轮转算法和优先级调度算法

3.ByVisuaIC++6.0

4.*/

#include<

stdio.h>

stdlib.h>

#include〈string.h>

typedefstruetnode

char

name[20];

/*进程的名字*/

int

prio;

/*进程的优先级*/

round;

/*分配CPU的时间片*/

eputime;

/♦CPU执行时间*/

needtime;

/*进程执行所需要的时间♦/

charstate;

/*进程的状态,W就绪态,R执行态,F

完成态*/

intcount;

/*记录执行的次数*/

structnode*next;

/*链表指针*/

}PCB;

PCB*ready=NULL,*run=NULL,*finish=NULL;

/*定艾三个队列,就绪队列,执行

队列和完成队列*/

irrtnum;

void

GetFirst();

/*从就绪队列取得第一个节点*/

Output();

/*输出队列信息*/

1nsertPrio(PCB

*in);

/*创建优先级队列,规定优先数越小,优先级

越高*/

1nsertTime(PCB

/*时间片队列*/

lnsertFinish(PCB*in);

PrioCreate();

/*优先级输入函数*/

TimeCreateO;

/*时间片输入函数*/

PriorityO;

/*按照优先级调度*/

RoundRunO;

/*时间片轮转调度*/

main(void)

charchose;

printfC1请输入要创建的进程数目:

\nR);

seanf("

Ed"

&

num);

getchar();

printfC*输入进程的调度方法:

(P/R)\nM);

seanf&

chose);

switch(chose)

{

case1P'

:

case'

p*:

PrioCreate();

Priority();

break;

caseR:

r'

TimeCreate();

defauIt:

return0;

}

voidGetFirst()/*取得第一个就绪队列节点*/

run=ready;

if(ready!

=NULL)

run->

state='

R'

;

ready=ready->

next;

next=NULL;

voidOutput()/*输出队列信息*/

PCB*p;

p=ready;

printf(M进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器

\n"

);

while(p!

二NULL)

printf(n%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->

name,p->

prio,p->

ro

und,p->

cputime,p->

needtime,p->

state,p->

count);

p二p->

p=finish;

printfC'

%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->

prio,p->

und,

*/

p->

needtime,p->

p=p->

I

p=run;

printf(,,%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\nM,p->

name,p->

prio,p->

cputime,p->

lnsertPrio(PCB*in)/*创建优先级队列,规定优先数越小,优先级越低

PCB*fst,*nxt;

fst=nxt=ready;

if(ready==NULL)/*如果队列为空,则为第一个元素*/

in->

next二ready;

ready=in;

else/*查到合适的位置进行插入*/

if(in->

prio>

=fst->

prio)/*比第一个还要大,则插入到队

头*/

eIse

while(fst->

next!

=NULL)/*移动指针查找第一个别它小的

元素的位置进行插入*/

nxt=fst;

fst=fst->

if(fst->

next=NULL)/*已经搜索到队尾,则其优先级数置

小,将其插入到队尾即可*/

in->

next=fst->

fst->

next=in;

else/*插入到队列中*/

nxt=in;

in->

next二fst;

voidInsertTime(PCB*in)/*将进程插入到就绪队列尾部*/

PCB*fst;

fst

ready;

if(ready

NULL)

 

in->

while(fst->

=NULL)

voidInsertFinish(PCB*in)/*将进程插入到完成队列尾部*/

fst=finish;

if(finish==NULL)

next=finish;

finish=in;

fst->

voidPrioCreateO/*优先级调度输入函数*/

PCB*tmp;

irrti;

printf(”输入进程名字和进程所需时间:

\nH);

for(i=0;

i<

num;

i++)

if((tmp=(PCB*)malIoc(sizeof(PCB)))==NULL)

perror("

maIlocH);

exit

(1);

1

scanftmp->

name);

getchar();

/*吸收回车符号*/

scanfC^d"

,&

(tmp->

needtime));

tmp->

cputime=0;

state=,W'

prio=50-tmp->

needtime;

/*设置其优先级,需要的

时间越多,优先级越低*/

round=0;

/*按照优先级从离到低,插入到就绪队列

count=0;

InsertPrio(tmp);

voidTimeCreateO/*时间片输入函数*/

printfC1输入进程名字和进程时间片所需时间:

\nu);

perror(MmallocH);

scanf(n%sH,tmp->

scanf,&

InsertTime(tmp);

while(run!

=NULL)/*当就绪队列不为空时,則调皮进程如执行队列执

行*/

/*输出每次调度过程中冬个节点的状态*/

whiIe(fIag)

run->

prio-二3;

/*优先级减去三*/

cputime++;

/*CPU时间片加一*/

needtime—;

/*进程执行完成的剩余时间减一*/

if(run->

needtime==0)/*如果进程执行完毕,将进程状态置为F.

将其插入到完成队列*/

state=F;

run->

count++;

/*进程执行的次数加一*/

InsertFinish(run);

flag=0;

else/*将进程状态置为也入就绪队列*/

W'

InsertTime(run);

flag=1;

GetFirst();

/*继续取就绪队列队头进程进入执行队列*

intflag=1;

while(run!

while(fIag)

needtime—;

if(run->

needtime==0)/*进程执行完毕*/

state=F;

elseif(run->

count=run->

round)/*时间片用完*/

W*;

/*计数器清零,为下次做准备*

1;

flag

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2