基于多队列反馈的进程调度Word文档格式.docx

上传人:b****1 文档编号:3568328 上传时间:2023-05-02 格式:DOCX 页数:31 大小:238.18KB
下载 相关 举报
基于多队列反馈的进程调度Word文档格式.docx_第1页
第1页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第2页
第2页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第3页
第3页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第4页
第4页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第5页
第5页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第6页
第6页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第7页
第7页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第8页
第8页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第9页
第9页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第10页
第10页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第11页
第11页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第12页
第12页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第13页
第13页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第14页
第14页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第15页
第15页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第16页
第16页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第17页
第17页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第18页
第18页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第19页
第19页 / 共31页
基于多队列反馈的进程调度Word文档格式.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于多队列反馈的进程调度Word文档格式.docx

《基于多队列反馈的进程调度Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于多队列反馈的进程调度Word文档格式.docx(31页珍藏版)》请在冰点文库上搜索。

基于多队列反馈的进程调度Word文档格式.docx

4.)撤销进程,该进程直接出就绪队列

四、主要数据结构及其说明

typedefstructNode

{

charname[20];

charstate;

//进程所处的状态,N新建,W等待,B阻塞,R运行,F结束

intround;

//时间片计数器

inttime;

//运行时间

structNode*next;

}LinkQueueNode,*PCB;

//定义PCB

typedefstruct

LinkQueueNode*front;

LinkQueueNode*rear;

}LinkQueue;

//定义队列

voidinitQueue(LinkQueue*Q)//队列的初始化函数

voidInitializa()//初始化所有队列

voidRunPrintf()//打印运行队列

voidBlockPrintf()//打印阻塞队列

voidReadyPrintf(LinkQueueq)//打印就绪队列

voidputout()//输出函数

voidEnterQueue(LinkQueue*Q,PCB*p)//进程插入队列函数

intDeleteQueue(LinkQueue*Q,PCB*p)//进程出队列

voidTransferRun(LinkQueue*q1,LinkQueue*q2,PCBq)//进程出就绪队列,入运行队列

voidTransfer(LinkQueue*q1,LinkQueue*q2,PCBq)

//进程唤醒或阻塞时队列转换的函数

intMultiDiapatch()

//调度函数,若此队列运行的进程时间片满,则进入下一级队列

intrun()//模拟运行

voidblock()//模拟阻塞

voidwake()//模拟唤醒

intCreateprocess(LinkQueue*Q)//进程的创建

voidmeanu()//菜单函数

五、程序运行时的初值和运行结果

 

六、源程序并附上注释【可是另一个源程序文件,在此应说明该文件名】

#include<

stdio.h>

stdlib.h>

dos.h>

String.h>

intcount=0;

LinkQueueqRun,qBlock,qReady1,qReady2,qReady3,qReady4;

//定义四个就绪队列

Q->

front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));

if(Q->

front!

=NULL)

{

rear=Q->

front;

front->

next=NULL;

}

}

voidInitializa()//初始化所有队列

initQueue(&

qRun);

qBlock);

qReady1);

qReady2);

qReady3);

qReady4);

PCBp;

printf("

运行队列:

"

);

p=qRun.front->

next;

while(p)

%s\t"

p->

name);

p=p->

\n需要时间:

printf("

%d\t"

time);

p=p->

\n进程状态:

%c\t"

state);

\n\n阻塞队列:

p=qBlock.front->

p=q.front->

**************************************************************\n"

**********************多级反馈调度****************************"

\n**************************************************************\n"

说明:

程序中四个就绪队列的时间片分别为10,15,20,30"

************************菜单**********************************\n"

1.创建进程2.阻塞进程3.唤醒进程4.撤销进程0.退出\n"

RunPrintf();

BlockPrintf();

\n\n队列1:

ReadyPrintf(qReady1);

\n\n队列2:

ReadyPrintf(qReady2);

\n\n队列3:

ReadyPrintf(qReady3);

\n\n队列4:

ReadyPrintf(qReady4);

(*p)->

rear->

next=*p;

rear=*p;

front==Q->

rear)

return0;

*p=Q->

next=(*p)->

rear==*p)

return1;

voidTransferRun(LinkQueue*q1,LinkQueue*q2,PCBq)//进程出就绪队列,入运行队列

DeleteQueue(q1,&

q);

q->

state='

R'

;

EnterQueue(q2,&

voidrunprocess()

intstate1=0,state2=0,state3=0,state4=0;

//state来判断就绪队列是否还有进程

if(qReady1.front!

=qReady1.rear)

TransferRun(&

qReady1,&

qRun,p);

state1=1;

else

if(qReady2.front!

=qReady2.rear)

{

TransferRun(&

qReady2,&

state2=1;

}

else

if(qReady3.front!

=qReady3.rear)

{

TransferRun(&

qReady3,&

state3=1;

}

else

if(qReady4.front!

=qReady4.rear)

{

TransferRun(&

qReady4,&

state4=1;

}

if(state1==0&

&

state2==0&

state3==0&

state4==0)

队列中无就绪进程!

system("

cls"

putout();

//进程唤醒或阻塞时队列转换的函数

W'

//调度函数,若此队列运行的进程时间片满,则进入下一级队列

qRun.front->

next->

time--;

++count;

if(qRun.front->

time==0)

DeleteQueue(&

qRun,&

p);

free(p);

runprocess();

count=0;

if(qRun.front->

round==count)

if(count==10)

qRun.front->

round=15;

Transfer(&

qReady2,p);

if(count==15)

round=20;

qReady3,p);

if(count==20)

round=30;

qReady4,p);

if(count==30)

runprocess();

count=0;

intrun()//模拟运行

if(qRun.front==qRun.rear)//运行队列空,则进行进程队列转换

MultiDiapatch();

voidblock()//模拟阻塞

if(qRun.front!

=qRun.rear)//运行队列不为空,则运行进程出运行队列,进入阻塞队列

p->

B'

EnterQueue(&

qBlock,&

队列中没有进程在运行!

voidwake()//模拟唤醒

if(qBlock.front!

=qBlock.rear)

//根据时间片;

来决定进入的就绪队列

if(qBlock.front->

round==10)

Transfer(&

qReady1,p);

if(qBlock.front->

round==15)

Transfer(&

if(qBlock.front->

round==20)

else

if(qBlock.front->

round==30)

{

Transfer(&

}

无等待进程!

voidendprocess()

if(qRun.front==qRun.rear)

信息提示:

无运行进程,请按Enter键运行进程!

选择菜单功能或按Enter键执行进程!

intCompareStr(LinkQueueq,charname[20])//比较字符串是否相同

if(strcmp(p->

name,name)==0)

return0;

intCompareName(charname[20])

intflag;

flag=CompareStr(qRun,name);

if(flag==0)

flag=CompareStr(qBlock,name);

flag=CompareStr(qReady1,name);

flag=CompareStr(qReady2,name);

flag=CompareStr(qReady3,name);

flag=CompareStr(qReady4,name);

intCreateprocess(LinkQueue*Q)//进程的创建

charn[20];

p=(PCB)malloc(sizeof(LinkQueueNode));

进程名:

"

fflush(stdin);

scanf("

%s"

&

n);

while(!

CompareName(n))//判断是否创建了已经创建过的进程

已经有相同名字的进程存在"

\n请重新输入未创建过的进程:

fflush(stdin);

scanf("

strcpy(p->

name,n);

所需时间:

%d"

(p->

time));

while(p->

time<

0)

输入不合法"

p->

round=10;

EnterQueue(Q,&

voidmeanu()//菜单函数

charc;

\n选择功能:

%c"

c);

while

(1)

if(c=='

1'

Createprocess(&

system("

\n选择菜单功能或者按enter执行进程:

\n"

scanf("

\n'

run();

\n选择功能或者按enter继续执行:

break;

elseif(c=='

2'

block();

printf("

\n选择功能:

while

(1)

3'

wake();

while

(1)

4'

endprocess();

0'

exit(0);

输入错误!

请选择正确的菜单功能选项:

intmain()

Initializa();

putout();

meanu();

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

当前位置:首页 > 自然科学 > 物理

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

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