研发设计1进程调度算法模拟Word文档下载推荐.docx
《研发设计1进程调度算法模拟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《研发设计1进程调度算法模拟Word文档下载推荐.docx(50页珍藏版)》请在冰豆网上搜索。
//用于表示进程状态,0:
阻塞态
}PCB;
1.3算法
voidFCFS()
Node*p=head->
next;
while(p!
=NULL)
{
cout<
<
"
执行进程"
endl<
p->
data.ID;
p=p->
}
cout<
endl;
所有进程都执行完成"
}
2.SJF模块
2.1功能
先找到运行时间最短的程序,然后执行,再从剩余的程序中找到运行时间最短的在执行,依次每次都执行运行时间最短的,直到程序执行完毕。
残骛楼諍锩瀨濟溆塹籟。
2..2数据结构
2.3算法
voidSJF()
Node*p;
Node*pmin;
while(head2->
next!
pmin=head2->
for(p=head2->
p!
=NULL;
p=p->
next)
{
if(pmin->
data.ALLTime>
data.ALLTime)
pmin=p;
}
执行剩余区间长度最短的进程"
pmin->
for(p=head2;
if(p->
next==pmin)
{
p->
next=p->
next->
free(pmin);
}
printf("
\n"
);
所有进程都执行完成。
\n\n"
}
3SearchMaxPRI模块
3.1功能
按照优先级从高到低依次执行程序
3.2数据结构
q0指向q的前一个进程,便于删除进程;
p返回优先级最大进程;
q用于遍历链表
3.3算法
voidSearchMaxPRI(intm)
Node*q=head->
Node*q0=head;
while(q!
if(q->
data.ALLTime==0)
cout<
进程已执行完成"
q->
n--;
q0->
next=q0->
free(q);
q=q0->
else
data.Priority>
data.Priority)
p=q;
q0=q0->
q=q->
if(n>
0)
action(p);
©
按照轮转的次序分配给每个程序一定的时间执行,执行完成后执行后面的进程,依次循环执行直到所有进程执行完成。
酽锕极額閉镇桧猪訣锥。
4.2数据结构
4.3算法
voidRR(intm)
while(head1->
p=head1->
Node*prep=head1;
Node*q;
while(p!
cout<
执行进程一个时间片"
for(q=head1;
q=q->
if(q->
next==p)
{
p->
data.ALLTime-=4;
data.CPUTime+=4;
}
data.ALLTime<
=0)
prep->
next=prep->
free(p);
p=prep->
else
prep=prep->
p=p->
进入下一次轮转"
四、运行结果及分析
该程序实现了进程调度的四种不同调度算法下的调度顺序的输出情况。
五、总结
通过该程序的实现,对进程的调度有了更多的了解,对于不同的系统和系统目标,通常采用不同的调度算法。
有的算法适用于为数众多的短作业调度,有的算法为系统合理的响应时间提供了保证。
调度算法的选择的合适与否很重要。
彈贸摄尔霁毙攬砖卤庑。
源代码:
#include<
stdio.h>
stdlib.h>
malloc.h>
time.h>
#include<
iostream.h>
#defineTRUE1
#defineFALSE0
#defineOK1
intALLTime;
intStatus;
typedefPCBDt;
typedefstructNode
Dtdata;
structNode*next;
}Node;
Node*head=(Node*)malloc(sizeof(Node));
Node*head1=(Node*)malloc(sizeof(Node));
Node*head2=(Node*)malloc(sizeof(Node));
intn;
voidcreate(intn)
inti=1;
srand((int)time(0));
head->
next=NULL;
Node*q=head;
优先数优先级CPUTimeAllTimeStatus"
謀荞抟箧飆鐸怼类蒋薔。
while(i<
=n)
Node*p=(Node*)malloc(sizeof(Node));
p->
data.ID=i;
p->
data.CPUTime=0;
data.Status=0;
data.Priority=rand()%10+1;
data.ALLTime=rand()%8+1;
"
data.ID<
data.Priority<
厦礴恳蹒骈時盡继價骚。
p->
data.CPUTime<
data.Status<
茕桢广鳓鯡选块网羈泪。
q->
next=p;
q=q->
i++;
Node*p0=head1;
head1->
for(q=head->
q!
Node*r=(Node*)malloc(sizeof(Node));
r->
data.ID=q->
data.CPUTime=q->
data.CPUTime;
data.Status=q->
data.Status;
data.Priority=q->
data.Priority;
data.ALLTime=q->
data.ALLTime;
p0->
next=r;
p0=p0->
Node*p1=head2;
head2->
Node*k=(Node*)malloc(sizeof(Node));
k->
p1->
next=k;
p1=p1->
voidaction(Node*p)
while(q!
执行一个时间片的进程"
if(q!
=p)
q->
data.Priority+1;
data.Priority-3;
4)
q->
data.ALLTime=0;
data.Status=1;
intmain()
请输入系统进程数:
cin>
>
n;
intm=n;
if(n==0)
此时没有就绪进程"
else
create(n);
先来先服务调度"
FCFS();
最短作业优先调度"
SJF();
优先权的分时调度"
while(head->
SearchMaxPRI(m);
轮转法调度"
RR(m);
设计2模拟银行家算法
1、通过对银行家算法的模拟,理解银行家算法的实现过程,了解系统解决死锁的方法
1、编程序模拟银行家算法
2、能体现算法的全过程
1.bank模块
1.1功能
利用银行家算法,给系统分配资源,避免死锁。
TypedefstructRESOURCE
intavailable[R];
//系统可用资源数
intallocation[W][R];
//M个进程已经得到N类资源的资源量
intneed[W][R];
//M个进程还需要N类资源的资源量
intrequest[R];
//请求资源个数
}RESOURCE
1.3算法
inti=0,j=0;
charchoice='
Y'
;
while(choice=='
||choice=='
y'
)
i=-1;
0||i>
=M)
请输入需申请资源的进程号:
i;
if(i<
=M)cout<
进程号不存在,重新输入!
请输入进程"
i<
申请各类资源的数量:
for(j=0;
j<
N;
j++)
资源"
:
cin>
request[j];
if(request[j]>
need[i][j])
进程"
申请的资源数大于进程"
还需要"
类资源的数量!
鹅娅尽損鹌惨歷茏鴛賴。
若继续执行系统将处于不安全状态!
choice='
N'
break;
available[j])
申请的资源数大于系统可用"
籟丛妈羥为贍偾蛏练淨。
继续执行系统将处于不安全状态!
if(choice=='
distribute(i);
if(check())
restore(i);
print();
else
是否继续银行家算法演示?
Y/N"
choice;
2.check模块
检查资源分配后系统是否处于安全状态。
2.2数据结构
intwork[R],finish[W];
inti,j;
for(j=0;
j++)work[j]=available[j];
for(i=0;
M;
i++)finish[i]=FALSE;
i++)
if(finish[i]==FALSE&
&
need[i][j]<
=work[j])
work[j]=work[i]+allocation[i][j];
finish[i]=TRUE;
if(finish[i]==FALSE)
系统不安全!
资源申请失败!
return1;
系统安全,分配成功!
return0;
通过实验结果可知银行家算法中,当进程申请的资源大于声明所需的最大资源或者大于系统当前可用的资源时,系统将处于不安全状态,资源分配失败,从而防止了死锁的产生。
預頌圣鉉儐歲龈讶骅籴。
通过该算法的模拟可知银行家算法是一种最有代表性的避免死锁的算法。
在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
为实现银行家算法,系统必须设置若干数据结构。
渗釤呛俨匀谔鱉调硯錦。
string.h>
#defineW10
#defineR10
intallresource[W];
intmax[W][R];
intM;
intN;
voidprint()
各种资源总量:
allresource[j]<
目前各种资源可利用数量:
available[j]<
各进程还需要的资源数量:
resourceA"
resourceB"
resourceC"
铙誅卧泻噦圣骋贶頂廡。
for(i=0;
进程"
for(j=0;
各进程已经得到的资源量:
resourc