使用动态优先权的进程调度算法的模拟
1、实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。2、实验
内容
(1)用C语言来实现对N个进程采用动态优先算法的进程调度;(2)每个用来标
识进程的进程控制块PCB用结构来描述,包括以下字段:,进程标识符id
,进程优先数priority,并规定优先数越大的进程,其优先权越高;,进程已
占用的CPU时间cputime;
,进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;,
进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进
程将进入阻塞状态;
,进程被阻塞的时间blocktime,表示已阻塞的进程再等待blocktime个时间
片
后,将转换成就绪态
,进程状态state;
,队列指针next,用来将PCB排成队列
(3)优先数改变的原则:
,进程在就绪队列中呆一个时间片,优先数增加1
,进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID01234
PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-
1-1-1-1BLOCKTIME30000STATEREADYREADYREADYREADYREADY(5)为
了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,
参照的具体格式如下:
RUNNINGPROG:i
READY_QUEUE:->id1->id2
BLOCK_QUEUE:->id3->id4
==================================ID01234PRIORITYP0P1P2P3
P4CPUTIMEC0C1C2C3C4ALLTIMEA0A1A2A3A4STARTBLOCKT0T1T2T3
T4BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S43、思考题
(1)在实际的调度中,除了按调度算法选择下一个执行的进程外,还应处理哪
些工作,
一、实验目的
通过动态优先权算法的模拟加深进程概念和进程调度过程的理解,并学习撰写
规范的科学研究报告。
二、实验环境及设备
(一)实验地点:实C三楼机房、宿舍
(二)主要仪器设备:PC机、RedFlagLinux和Windows7操作系统、g++和
VC++6.0环境
三、实验内容
1(对N个进程采用动态优先权算法的进程调度;
2(每个用来标识进程的进程控制块PCB用结构描述,包括以下字段:进程标识
数ID,进程优先数PRIORITY,进程以占用的CPU时间CPUTIME,进程还需占用的
CPU时间ALLTIME,进程状态STATE等。
3(优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1,进程每
运行一个时间片优先数减3。
4(设置调度前的初始状态。
5(将每个时间片内的进程情况显示出来。
四、调试分析
程序首先设置一个struct,模拟操作系统的PCB数据结构,并初始化。PCB有
ID、PRIORITY、CPUTIME、ALLTIME、STATE五个字段,其中STATE有两个状态,0
为未完成,1为完成。首先,程序会调用maxp()函数找出优先权PRIORITY最大的
进程ID,如果有若干个进程的PRIORITY相同,则程序会选择还需时间ALLTIME最
少的进程,取出ID作为下一个时间片要执行的进程。当前进程执行完后,程序会
调用change()函数修改进程的各个字段,未执行的进程呆
一个时间片优先权PRIORITY就+1,刚执行完的进程优先权PRIORITY就-3,并
且已经执行的CPU时间CPUTIME增加1,还需CPU时间ALLTIME减少1。如
果一个进程还需CPU时间ALLTIME为0,说明该进程完成了,状态STATE就修
改为1,表示进程已经完成了,同时优先权变为0或者更低的数值,表示该进
程不
能再执行了。程序每运行一个时间片,就调用display()函数将所有进程的字
段显
示出来。如果所有程序的状态都为1了,表示所有进程都执行完了,程序将退
出。
五、实验结果
===============================================================ID0
1234PRIORITY93830290CPUTIME00000ALLTIME33634STATE
00000RUNNINGPROG:1
===============================================================ID0
1234PRIORITY103531301CPUTIME01000ALLTIME32634STATE
00000RUNNINGPROG:1
===============================================================ID0
1234PRIORITY113232312CPUTIME02000ALLTIME31634STATE
00000RUNNINGPROG:1
===============================================================ID0
1234PRIORITY12033323CPUTIME03000ALLTIME30634STATE
01000
RUNNINGPROG:2
===============================================================ID0
1234PRIORITY13030334CPUTIME03100ALLTIME30534STATE
01000RUNNINGPROG:3
===============================================================ID0
1234PRIORITY14031305CPUTIME03110ALLTIME30524STATE
01000RUNNINGPROG:2
===============================================================ID0
1234PRIORITY15028316CPUTIME03210ALLTIME30424STATE
01000RUNNINGPROG:3
===============================================================ID0
1234PRIORITY16029287CPUTIME03220ALLTIME30414STATE
01000RUNNINGPROG:2
===============================================================ID0
1234PRIORITY17026298CPUTIME03320
ALLTIME30314STATE01000RUNNINGPROG:3
===============================================================ID0
1234PRIORITY1802709CPUTIME03330ALLTIME30304STATE0
1010RUNNINGPROG:2
===============================================================ID0
1234PRIORITY19024010CPUTIME03430ALLTIME30204STATE
01010RUNNINGPROG:2
===============================================================ID0
1234PRIORITY20021011CPUTIME03530ALLTIME30104STATE
01010RUNNINGPROG:2
===============================================================ID0
1234PRIORITY2100012CPUTIME03630ALLTIME30004STATE0
1110RUNNINGPROG:0
===============================================================ID0
1234
PRIORITY1800013CPUTIME13630ALLTIME20004STATE011
10RUNNINGPROG:0
===============================================================ID0
1234PRIORITY1500014CPUTIME23630ALLTIME10004STATE0
1110RUNNINGPROG:0
===============================================================ID0
1234PRIORITY000015CPUTIME33630ALLTIME00004STATE1
1110RUNNINGPROG:4
===============================================================ID0
1234PRIORITY000012CPUTIME33631ALLTIME00003STATE1
1110RUNNINGPROG:4
===============================================================ID0
1234PRIORITY00009CPUTIME33632ALLTIME00002STATE11
110RUNNINGPROG:4
===============================================================ID0
1234PRIORITY00006CPUTIME33633ALLTIME00001STATE11
110RUNNINGPROG:4
===============================================================ID0
1234PRIORITY00000CPUTIME33634ALLTIME00000STATE11
111RUNNINGPROG:0
Pressanykeytocontinue
从上面的执行结果知道,进程的执行顺序为:
1->1->1->2->3->2->3->2->3->2->2->2->0->0->0->4->4->4->4六、实验源程
序
//使用动态优先权的进程调度算法的模拟
#include
#include
inti;//循环值
intj;//未执行完的进程数即还在阻塞或就绪队列中的进程数
ints;//优先权数
intm;//最大priority的id即应该被调用的id号
structpcb
{
intid;
intp;//priority优先权
intcputime;
intalltime;
intstate;//0——就绪1——完成
};
structpcbpro[5]={
{0,9,0,3,0},
{1,38,0,3,0},
{2,30,0,6,0},
{3,29,0,3,0},
{4,0,0,4,0}
};
intmaxp()//求出最大priority所在进程的id{
s=pro[0].p;
intmaxpriority=pro[0].p;
intminalltime=pro[0].alltime;
m=pro[0].id;
for(i=1;i
{
if(pro[i].p>maxpriority)
{
maxpriority=pro[i].p;//max为最大的优先权数
minalltime=pro[i].p;
m=pro[i].id;//最大p的id
}
elif(pro[i].p==maxpriority)
{
if(pro[i].alltime>minalltime)
{
minalltime=pro[i].alltime;
m=pro[i].id;
}
}
}
returnm;
}
voidchange()
{
maxp();
intx;//得到m现在的数组编号
for(i=0;i
{
if(1!=pro[i].state)
pro[i].p++;//完成执行一个时间片优先权加1的操作
}
for(i=0;i
if(pro[i].id==m)
x=i;
pro[x].cputime++;
pro[x].p=pro[x].p-4;
pro[x].alltime--;
if(pro[x].alltime==0)
{
pro[x].state=1;
pro[x].p=0;
}
}
voiddisplay()
{
cout<<"=============================================================
==n";
cout<<"ID"<<"t";
for(i=0;i
{
(10);
cout<
}
cout<
for(i=0;i
{
(10);
cout<
}
cout<
for(i=0;i
{
(10);
cout<
}
cout<
for(i=0;i
{
(10);
cout<
}
cout<
for(i=0;i
{
(10);
cout<
}
cout<
change();
cout<<"RUNNINGPROG:"<
}
intmain()
{
j=5;//最初有5个进程
intcount=0;
while(j!=count)
{
for(i=0;i
if(pro[i].state==1)
count++;
if(5==count)
break;
el
count=0;
display();
getchar();//输出暂停
}
display();
return0;
}
七、实验总结
本次实验完成了进程调度的模拟实验,实现对5个进程采用动态优先权算法的
进程调度,每个用来标识进程控制块的PCB用数据结构来描述,进程在就绪队列中
呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。动态优先权算
法在创建进程时赋予了进程一个优先权,可以随进程的推进或随其等待时间的增加
而改变,这样获得更好的调度性能,而且有很强的灵活性。在写程序的时候,一开
始没考虑到优先权相同的时候进程调度的次序,这是不合理的,认真思考了一下老
师给我们上的理论课,结合短作业优先调度算法的原理,在优先权相同的时候,选
取还需时间ALLTIME最少的进程来运行,这样就可以解决进程调度的不确定性,而
且提高了进程调度的性能,使短作业尽早完成,释放出更多的资源供其他进程使
用。通过本次实验,我理解了动态优先权调度算法的原理,而且通过亲自编写程序
去模拟这个过程,印象更加深刻了。
本文发布于:2022-11-26 19:27:54,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/26214.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |