实验进程调度Word文档格式.docx
- 文档编号:21719432
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:108.53KB
实验进程调度Word文档格式.docx
《实验进程调度Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验进程调度Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
进程标识符号,取值1—5。
Prior:
优先级,随机产生,范围5—10。
Used:
目前已占用的CPU时间数,初值为0;
当该进程被调用执行时,每执行一个时间片,Used加1。
Need:
进程尚需的CPU时间数,初值表示该进程需要运行的总时间,取值范围为1—5。
并随机产生,每运行一个时间片need减1;
need为0则进程结束。
Status:
进程状态R(运行),J(就绪),F(完成);
初始时都处于就绪状态。
Next:
指向就绪队列中下一个进程的PCB的指针。
(2)初始状态及就绪队列组织:
5个进程初始都处于就绪状态,进程标识1—5,used初值都为0。
各进程的优先级随机产生,范围1—5。
处于就绪状态的进程,用队列加以组织,队列按优先级由高到低依次排列,队首指针设为head。
(3)调度原则以及运行时间的处理:
正在执行的进程每执行一个时间片,其优先级减1(允许优先级为负)。
进程调度将在以下情况发生:
当正在运行的程序其优先级小于就绪队列队首进程的优先级时。
程序中进程的运行时间以逻辑时间片为单位。
2.2时间片轮转算法说明
(1)PCB的结构(如下图所示):
轮转法中,设PCB的结构如右图所示,其中各数据项的含义如下:
Span:
在某一轮中,分配给先运行进程的时间片数,取值1—3。
现运行进程在本轮执行过程已用的时间片数。
进程尚需的CPU时间数,初值表示该进程需要运行的总时间,取值范围5—10。
初始时所有进程处于就绪状态。
Span、Used在每轮开始时赋初值,Used初值为0,Span初值要求随机产生。
队首指针设为head,队尾指针为tail。
(3)调度原则:
当一个进程被调度程序执行时,每经过一个时间片,Need减1,Used加1,如果Need为0,表示该进程结束,如果Need不为0,并且Used小于本轮Span值,则该进程可继续运行,若Need不为0,且Used等于Span值,则该进程本轮运行时间已到,将其链接到队尾,再调度下一个队首进程运行。
3、实验步骤
1、理解本实验中有关调度算法的说明。
2、根据调度算法的说明,画出相应的程序流程图。
3、按照程序流程图,用C/C++语言编程并实现。
4、流程图
(1)时间片轮转流程图
(2)优先级算法流程图
5、源代码与测试数据与实验结果(可以抓图粘贴)
时间片轮转程序
#include<
iostream>
usingnamespacestd;
typedefenum{R,J,F}Status;
typedefstructPCB
{
intId;
intSpan;
intUsed;
intNeed;
StatusStatus;
PCB*Next;
}Process;
Process*head=NULL,*tail=NULL;
intr(intm,intn)//生成(m,n)范围内的随机整数
returnrand()%(n-m+1)+m;
}
//产生一个进程
Process*initone()
Process*p;
p=(Process*)malloc(sizeof(Process));
p->
Used=0;
Span=0;
Need=r(1,5);
Status=J;
Next=NULL;
returnp;
//进程就绪队列初始化
voidinitlist()
inti;
Process*p,*q;
for(i=0;
i<
5;
i++)
{
p=initone();
p->
Id=i+1;
if(head==NULL)
{head=p;
q=p;
else{q->
Next=p;
}
tail=q;
//进程队列显示
voidshow()
cout<
<
"
进程ID"
'
\t'
时间片"
已使用时间片"
所需时间片"
状态"
endl;
p=head;
do
cout<
p->
Id<
Span<
Used<
\t\t"
Need<
;
switch(p->
Status)
{
caseR:
cout<
运行"
break;
caseJ:
就绪"
caseF:
完成"
}
p=p->
Next;
}while(p!
=NULL);
//时间片轮转算法进行进程调度
voidscheduling()
while(head!
=NULL)
p=head;
Span=r(1,3);
show();
if(p->
Need>
Span)
p->
Used=p->
Used+p->
Span;
Need=p->
Need-p->
Status=R;
show();
head=p->
tail->
tail=p;
else
{
Need;
Need=0;
Status=F;
show();
intmain()
initlist();
scheduling();
return0;
进程ID时间片已使用时间片所需时间片状态
1002就绪
2003就绪
3005就绪
4001就绪
5005就绪
1202就绪
1220完成
2103就绪
2012运行
3105就绪
2012就绪
3014运行
4201就绪
3014就绪
4210完成
5305就绪
5032运行
2312就绪
5032就绪
2330完成
3314就绪
3041运行
5232就绪
3041就绪
5250完成
3141就绪
3150完成
Pressanykeytocontinue
优先级算法程序
intPriority;
Process*head=NULL;
Process*Initone()
Priority=r(5,10);
Need=r(1,3);
p=Initone();
//显示队列
优先级"
Priority<
//对队列进程按照优先级排序
voidsort()
Process*first;
/*为原链表剩下用于直接插入排序的节点头指针*/
Process*t;
/*临时指针变量:
插入节点*/
/*临时指针变量*/
Process*q;
/*临时指针变量*/
first=head->
/*原链表剩下用于直接插入排序的节点链表*/
head->
/*只含有一个节点的链表的有序链表*/
while(first!
=NULL)/*遍历剩下无序的链表*/
{
for(t=first,q=head;
((q!
=NULL)&
&
(q->
Priority>
=t->
Priority));
p=q,q=q->
Next);
/*无序节点在有序链表中找插入的位置*/
first=first->
/*无序链表中的节点离开,以便它插入到有序链表中。
*/
if(q==head)/*插在第一个节点之前*/
head=t;
}
else/*p是q的前驱*/
Next=t;
t->
Next=q;
/*完成插入动作*/
//用优先级算法进行进程调度
Priority=p->
Priority-1;
Used+1;
Need-1;
Need==0)
elsep->
if(head!
{sort();
elsebreak;
sort();
进程ID优先级已使用时间片所需时间片状态
11003就绪
2902就绪
31002就绪
4501就绪
5903就绪
1912运行
1912就绪
3911运行
3911就绪
3820运行
3820完成
1821运行
1821就绪
2811运行
2811就绪
5812运行
5812就绪
5721运行
5721就绪
2720运行
2720完成
1730运行
1730完成
5630运行
5630完成
4410运行
4410完成
6、分析与思考
1、逻辑时间片该如何实现?
答:
系统将所有的就绪进程按先来先服务算法的原则,排成一个队列,每次调度时,系队列首进程,并让其执行一个时间片。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序根据这个请求停止该进程的运行,将它送到就绪队列的末尾,再把处理机分给就绪队列中新的队首进程,同时让它也执行一个时间片。
2、如果不使用指针操作,是否也可以使用数组实现进程就绪队列的组织?
可以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 进程 调度