进程管理和调度Word格式文档下载.docx

上传人:b****5 文档编号:21424033 上传时间:2023-01-30 格式:DOCX 页数:16 大小:18.63KB
下载 相关 举报
进程管理和调度Word格式文档下载.docx_第1页
第1页 / 共16页
进程管理和调度Word格式文档下载.docx_第2页
第2页 / 共16页
进程管理和调度Word格式文档下载.docx_第3页
第3页 / 共16页
进程管理和调度Word格式文档下载.docx_第4页
第4页 / 共16页
进程管理和调度Word格式文档下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

进程管理和调度Word格式文档下载.docx

《进程管理和调度Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《进程管理和调度Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。

进程管理和调度Word格式文档下载.docx

voidOutput1();

//输出时间片轮转队列信息

voidOutput2(intsumtime);

//输出优先权调度队列信息

voidInsertPrio(PCB*in);

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

voidInsertRound(PCB*in);

//创建时间片就绪队列

voidInsertFinish(PCB*in);

//创建完成队列

voidPrioCreate();

//优先级输入函数

voidTimeCreate();

//时间片轮转调度算法——输入函数

voidPriority();

//按照优先级调度

voidRoundRun();

//时间片轮转调度

voidupdate_priority(int&

add_priority);

//等待队列的优先权更新

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

//定义3个队列,就绪队列,执行队列和完成队列

intmain()

charchoose;

FILE*fp;

cout<

<

"

*****************欢迎进入进程管理和调度的算法模拟*****************\n"

endl;

*****************************主菜单*****************************"

输入进程的调度方法(请输入对应数字):

1.抢占式动态优先权调度(手工输入)"

2.时间片轮转调度(手工输入)"

3.抢占式动态优先权调度(从文件读入已设定的的数据)"

4.时间片轮转调度(从文件读入已设定的的数据)"

5.退出程序"

cin>

>

choose;

switch(choose)

{

case'

1'

:

PrioCreate();

Priority();

Output1();

break;

2'

TimeCreate();

RoundRun();

3'

fp=freopen("

yxj.txt"

"

r"

stdin);

//优先级输入文件

fclose(fp);

4'

sjp.txt"

//时间片输入文件

5'

exit

(1);

default:

break;

}

return0;

}

/*

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

run=ready;

if(ready!

=NULL)

strcpy(run->

state,"

Run"

);

ready=ready->

next;

run->

next=NULL;

}

*/

intGetFirst(intsumtime)//取得就绪队列第一个节点

{

PCB*fst,*temp1,*temp2,*temp3;

=NULL&

&

sumtime<

ready->

arrive)//ready队列改变

{

fst=ready;

while(sumtime<

fst->

arrive)//寻找到达时间最小的

{

temp1=fst;

//记录符合条件的前面一个值

fst=fst->

if(fst==NULL)

{

sumtime++;

Output2(sumtime);

fst=ready;

if(sumtime>

=fst->

arrive)//搜索一轮之后,设置CPU时间+1,即全部进程都等待

{

run=ready;

if(ready!

{

strcpy(run->

ready=ready->

run->

}

returnsumtime;

}

}

}

temp2=fst;

temp1->

next=fst->

temp3=ready;

ready=fst;

ready->

next=temp3;

run=ready;

strcpy(run->

ready=ready->

run->

returnsumtime;

}

voidOutput2(intsumtime)

-------------------------------------------------------"

PCB*p;

p=run;

现在CPU时间为:

sumtime<

if(p==NULL&

ready==NULL)

cout<

所有进程调度已经完成!

队列具体信息如下:

exit(0);

进程名到达时间服务时间剩余时间优先权状态"

if(p!

setw(3)<

p->

name<

\t"

<

setw(5)<

arrive<

setw(7)<

fuwu_time<

setw(9)<

needtime<

setw

(2)<

prio<

state<

p=p->

p=ready;

while(p!

//创建优先级就绪队列,规定优先权数越小,优先级越低,0为最低优先权数

voidInsertPrio(PCB*in)

PCB*fst,*temp;

fst=ready;

intflag=0;

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

in->

next=ready;

ready=in;

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

if(in->

prio>

fst->

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

{

in->

ready=in;

}

else

while(fst->

next!

=NULL)//移动指针查找第一个别它小的元素的位置进行插入

{

temp=fst;

fst=fst->

if(in->

prio)//插入就绪队列中

in->

next=fst;

temp->

next=in;

flag=1;

break;

elseif(in->

prio==fst->

prio&

in->

arrive)//优先级一样,若先到达则优先考虑

}

if(fst->

next==NULL&

flag==0)//已经搜索到队尾,则其优先级数最小,将其插入到队尾即可

in->

next=NULL;

fst->

voidInsertRound(PCB*in)//将进程插入到就绪队列尾部——时间片轮转就绪队列

PCB*fst;

if(ready==NULL)

//将进程插到空就绪队列

ready=in;

else

while(fst->

=NULL)

fst=fst->

//遍历到队列尾部

in->

next=fst->

//将进程插到就绪队列尾部

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

fst=finish;

if(finish==NULL)

next=finish;

//将进程插到空完成队列

finish=in;

//将进程插到完成队列尾部

add_priority)

while(fst!

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

if(fst->

=minprio)//优先权小于minprio,系统假定为50,则优先权+add_priority;

fst->

prio=fst->

prio+add_priority;

fst=fst->

voidTimeCreate()//时间片轮转调度算法——输入函数

intnum;

//要创建的进程数目

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

\n"

;

num;

PCB*tmp;

inti;

floatT_xiangying;

//响应时间

请输入响应时间\n"

T_xiangying;

//T_xiangying=TXIANGYING;

请输入进程名称到达时间服务时间\n"

for(i=0;

i<

num;

i++)

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

perror("

malloc"

exit

(1);

cin>

tmp->

name>

arrive>

fuwu_time;

strcpy(tmp->

state,"

Wait"

tmp->

prio=0;

round=T_xiangying/num;

//系统假设时间片是1

count=0;

tmp->

needtime=tmp->

//把服务时间赋值给还需时间

InsertRound(tmp);

voidRoundRun()//时间片轮转调度算法

intsum_cputime=0;

intflag=1;

**********时间片轮转调度算法具体实现过程:

**********"

Output2(sum_cputime);

GetFirst(sum_cputime);

while(run!

//Output();

while(flag)

sum_cputime++;

run->

count++;

needtime--;

if(run->

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

state,"

Finish"

run->

zhouzhuan=sum_cputime-run->

arrive;

ave_daiquan=(run->

zhouzhuan*1.0)/run->

InsertFinish(run);

flag=0;

elseif(run->

count==run->

round)//时间片用完

strcpy(run->

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

InsertRound(run);

flag=1;

voidOutput1()//输出队列,按完成时间排序

进程名到达时间完成时间服务时间周转时间带权周转时间"

p=finish;

<

arrive+p->

zhouzhuan<

ave_daiquan<

p=p->

************************感谢您的使用!

************************"

voidPrioCreate()//优先级调度输入函数

请输入进程名称到达时间服务时间优先级初值\n"

fuwu_time>

prio;

round=0;

//假设时间片是0

InsertPrio(tmp);

voidPriority()//按照优先级调度,每次执行一个时间片

intadd_prio;

//add_prio=ADDPRIO;

//优先权的增加值

请输入优先权的增加值:

add_prio;

intupdate_time;

//update_time=UPDATETIME;

//提升优先权的时间间隔

提升优先权的时间间隔:

update_time;

***************您输入的调度信息如下:

***************"

//输入数据,为改变状态

inttimecount=0;

sum_cputime=GetFirst(sum_cputime);

**********抢占式优先级调度算法具体实现过程:

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

while(run!

=NULL)//执行进程

while(flag)

run->

prio=run->

prio-1;

//优先权减1

//进程还需要的时间片数减1

sum_cputime++;

timecount++;

//时间片计数器

if(run->

needtime==0)//如果进程执行完毕,将进程状态置为Finish,将其插入到完成队

strcpy(run->

run->

InsertFinish(run);

Output2(sum_cputime);

//输出完成进程信息

if(timecount==update_time)

timecount=0;

update_priority(add_prio);

else//将进程状态置为W,入就绪队列

strcpy(run->

InsertPrio(run);

flag=0;

flag=1;

sum_cputime=GetFirst(sum_cputime);

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

Output2(sum_cputime);

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

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

当前位置:首页 > PPT模板 > 国外设计风格

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1