操作系统实验动态优先级进程调度实验报告.docx

上传人:b****5 文档编号:6595212 上传时间:2023-01-08 格式:DOCX 页数:13 大小:990.21KB
下载 相关 举报
操作系统实验动态优先级进程调度实验报告.docx_第1页
第1页 / 共13页
操作系统实验动态优先级进程调度实验报告.docx_第2页
第2页 / 共13页
操作系统实验动态优先级进程调度实验报告.docx_第3页
第3页 / 共13页
操作系统实验动态优先级进程调度实验报告.docx_第4页
第4页 / 共13页
操作系统实验动态优先级进程调度实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

操作系统实验动态优先级进程调度实验报告.docx

《操作系统实验动态优先级进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验动态优先级进程调度实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

操作系统实验动态优先级进程调度实验报告.docx

操作系统实验动态优先级进程调度实验报告

 

操作系统实验——动态优先级进程调度实验报告(总19页)

1.实验名称:

动态优先权调度过程中就绪队列的模拟

2.实验要求:

采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。

3.实验内容:

(1)每个进程控制块PCB用结构描述,包括以下字段:

*进程标识符id

*进程优先数priority,并规定优先数越大的进程,其优先权越高。

*进程已占用的CPU时间cputime

*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0

*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态

*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime个时间片后,将转换成就绪状态

*进程状态state

*队列指针next,将PCB排成队列。

(2)调度前,系统中有五个进程,它们的初始状态如下:

ID

0

1

2

3

4

PRIORITY

9

38

30

29

0

CPUTIME

0

0

0

0

0

ALLTIME

3

3

6

3

4

STARTBLOCK

2

-1

-1

-1

-1

BLOCKTIME

3

0

0

0

0

STATE

READY

READY

READY

READY

READY

(3)进程在就绪队列呆一个时间片,优先数增加1。

(4)进程每运行一个时间片,优先数减3。

(5)按下面格式显示每个时间片内就绪队列的情况:

READY_QUEUE:

->id1->id2

4.任务分析

进程控制块用结构体来表示,包含它的各项属性。

建立两个队列:

一个就绪队列,一个阻塞队列。

创建一个进程控制块表示当前正在运行的进程。

程序开始运行时,所有进程都在就绪队列中。

当startblock减少到0时,进程进入阻塞队列。

在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。

在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。

当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。

5.程序流程图

6.程序清单

#include

#include

usingnamespacestd;

#defineLEN5d=i;

ps[i].state=READY;

ps[i].cputime=0;

ps[i].alltime=3;

ps[i].blocktime=0;

ps[i].startblock=-1;

}

ps[0].priority=9;

ps[1].priority=38;

ps[2].priority=30;

ps[3].priority=29;

ps[4].priority=0;

ps[2].alltime=6;

ps[4].alltime=4;

ps[0].startblock=2;

ps[0].blocktime=3;

cp=NULL;d<<"\t";

}

cout<<"\nPRIORITY\t";

for(inti=0;i

cout<

}

cout<<"\nCPUTIME\t\t";

for(inti=0;i

cout<

}

cout<<"\nALLTIME\t\t";

for(inti=0;i

cout<

}

cout<<"\nSTARTBLOCK\t";

for(inti=0;i

cout<

}

cout<<"\nBLOCKTIME\t";

for(inti=0;i

cout<

}

cout<<"\nSTATE\t\t";

for(inti=0;i

if(ps[i].state==READY){

cout<<"READY"<<"\t";

}

elseif(ps[i].state==BLOCK){

cout<<"BLOCK"<<"\t";

}

elseif(ps[i].state==END){

cout<<"END"<<"\t";

}

}

cout<

}

//出队,返回进程指针

PCB*pop(Queue*q){

PCB*temp;

if(q->size>0){

temp=q->data[0];//取出队首进程

for(inti=0;isize-1;i++){

q->data[i]=q->data[i+1];//其他进程依次向前移动

}

q->size--;

returntemp;//返回队首进程

}

returnNULL;

}

//入队

voidpush(Queue*q,PCB*p){

if(q->size

q->data[q->size]=p;//将入队的进程放在队尾

q->size++;

}

return;

}

//运行进程

voidrun(){

if>0||>0){

if(cp==NULL){//程序一开始运行时,从就绪队列取出首进程

cp=pop(&rQueue);

}

//当前进程没有结束,但优先级比就绪队列首进程低

if(cp->alltime>0&&cp->priority<[0]->priority){

push(&rQueue,cp);//将当前进程放入就绪队列

cp=pop(&rQueue);//就绪队列队首进程成为当前进程

}

if(cp->alltime==0){//如果当前进程运行结束

cp->state=END;//改变进程状态

cp=pop(&rQueue);//从就绪队列取出新的当前进程

}

cp->priority-=3;//修改当前进程的优先级

//startblock为0,标志着当前进程要进入阻塞状态

if(cp->startblock==0&&cp->blocktime>0){

cp->state=BLOCK;//修改当前进程的状态

push(&bQueue,cp);//将当前进程加入阻塞队列

cp=pop(&rQueue);//从就绪队列取出新的当前进程

}

elseif(cp->startblock>0){//当前进程的startblock为正数时

cp->startblock--;//运行一次减一个时间片

}

cp->cputime++;//当前进程占用CPU时间片+1

if(cp->alltime>0){//当前进程还需运行的时间片-1

cp->alltime--;

if(cp->alltime==0){//减到0时,修改进程状态

cp->state=END;

}

}

for(inti=0;i<;i++){//每运行一个时间片

[i]->priority++;//就绪队列中的进程优先级+1

}

for(inti=0;i<;i++){//每运行一个时间片

if[i]->blocktime>0){//阻塞队列中的进程blocktime-1

[i]->blocktime--;

}

}

//当阻塞队列队首进程blocktime为0时

if>0&&[0]->blocktime==0){

[0]->state=READY;//修改进程状态

push(&rQueue,pop(&bQueue));//将阻塞队列首进程取出,放入就绪队列

}

//每运行一个时间片,就绪队列排一次序

rQueueSort();

}

}

//主函数

intmain(){

init();//初始化

print();//打印进程信息

while

(1){

_sleep(1000);

if==0&&==0){//当两个队列都为空时,结束程序

cp->state=END;

break;

}

run();//运行进程

print();//打印进程信息

}

return0;

}

7.实验过程记录

程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、alltime--。

在就绪队列中的进程优先级全部加1。

执行几次之后,1号进程执行完毕而且优先级也不是最高的了,所以优先级为33的2号进程成为当前进程,开始执行。

2号进程执行一次后,优先级由33降低到30,于是3号进程成为当前进程,2号进程进入就绪队列等待。

同理,执行一次后,3号进程的优先级由33降低到30,2号进程再次成为当前进程,3号进程进入就绪队列等待。

这个过程会重复几次,就不重复了。

3号进程执行完毕后退出,2号进程成为当前进程。

2号进程执行完毕后,0号进程成为当前进程。

0号进程执行2次后,startblock为0了,进入阻塞队列,停止运行,4号进程开始执行。

4号进程运行几次后,0号进程的blocktime为0了,0号进程从阻塞队列转入就绪队列

此时,4号进程的优先级低于0号进程,4号进程停止运行,0号进程再次运行。

0号进程执行完毕后,只剩下4号进程了,4号进程执行一次也完成了。

程序总体执行完毕。

8.实验结果分析

实验中,没有运行完毕的进程的优先级都会实时变化。

每次时间片结束,就会选择就绪队列中优先级最高的进程和当前进程进行比较。

如果当前进程没有运行完毕,就被优先级更高的进程替换了,则进入就绪队列等待。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1