基于某多队列反馈的进程调度Word文件下载.docx
- 文档编号:22581624
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:31
- 大小:238.24KB
基于某多队列反馈的进程调度Word文件下载.docx
《基于某多队列反馈的进程调度Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于某多队列反馈的进程调度Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
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)
Transfer(&
else
if(qBlock.front->
round==30)
{
}
无等待进程!
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("
if(c=='
\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();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 队列 反馈 进程 调度