all time

更新时间:2022-11-26 19:27:54 阅读: 评论:0


2022年11月26日发(作者:上海高中)

使用动态优先权的进程调度算法的模拟

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小时内删除。

上一篇:no easy day
下一篇:起飞时间
标签:all time
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图