动态优先权进程调度算法实验报告.docx

上传人:b****1 文档编号:2672485 上传时间:2023-05-04 格式:DOCX 页数:15 大小:418.04KB
下载 相关 举报
动态优先权进程调度算法实验报告.docx_第1页
第1页 / 共15页
动态优先权进程调度算法实验报告.docx_第2页
第2页 / 共15页
动态优先权进程调度算法实验报告.docx_第3页
第3页 / 共15页
动态优先权进程调度算法实验报告.docx_第4页
第4页 / 共15页
动态优先权进程调度算法实验报告.docx_第5页
第5页 / 共15页
动态优先权进程调度算法实验报告.docx_第6页
第6页 / 共15页
动态优先权进程调度算法实验报告.docx_第7页
第7页 / 共15页
动态优先权进程调度算法实验报告.docx_第8页
第8页 / 共15页
动态优先权进程调度算法实验报告.docx_第9页
第9页 / 共15页
动态优先权进程调度算法实验报告.docx_第10页
第10页 / 共15页
动态优先权进程调度算法实验报告.docx_第11页
第11页 / 共15页
动态优先权进程调度算法实验报告.docx_第12页
第12页 / 共15页
动态优先权进程调度算法实验报告.docx_第13页
第13页 / 共15页
动态优先权进程调度算法实验报告.docx_第14页
第14页 / 共15页
动态优先权进程调度算法实验报告.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

动态优先权进程调度算法实验报告.docx

《动态优先权进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法实验报告.docx(15页珍藏版)》请在冰点文库上搜索。

动态优先权进程调度算法实验报告.docx

动态优先权进程调度算法实验报告

 

《动态优先权进程调度算法》实验报告

 

题目:

动态优先权进程调度算法的模拟实现

专业:

班级:

学号:

姓名:

日期:

一﹑实验目的

通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。

二﹑实验内容与基本要求

编制模拟动态优先权算法的程序,并给出的例子验证所编写的程序的正确性。

(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个进程,它们得初始状态如下:

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

为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

格式如下:

 

RUNNINGPROG:

i

READY_QUEUE:

->id1->id2

BLOCK_QUEUE:

->id3->id4

==========================================================

ID01234

PRIORITYP0P1P2P3P4

CPUTIMEC0C1C3C4C5

ALLTIMEA0A1A2A3A4

STARTBLOCKT0T1T2T3T4

BLOCKTIMEB0B1B2B3B4

STATES0S1S2S3S4

 

三、实验报告内容

1、动态优先权算法原理

动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

若所有的就绪进程具有各不相同的优先权初值,那么,对于优先权初值低的进程,在等待了足够的时间后,其优先权便可能升为最高,从而可以获得处理机。

当采用抢占式优先权调度算法时,如果再规定当前进程的优先权以速率b下降,则可防止一个长作业长期地垄断处理机。

 

2、程序流程图

3、程序及注释

#include

#include

#include

typedefstructnode

{

intid;//进程标识数

intpriority;//进程优先数,优先数越大优先级越高

intcputime;//进程已占用的CPU时间

intalltime;//进程还需占用的CPU时间

intstartblock;//进程的阻塞时间

intblocktime;//进程被阻塞的时间

charstate[10];//进程状态

structnode*next;//队列指针

}PCB;

PCB*CreatQueue(intnum)//创建一个就绪队列

{

inti;//i为循环计数器

PCB*head,*temp1,*temp2,*temp3;//head为就绪队列的头指针,temp1为创建进程结点的指针,temp2、temp3分别为比较结点的前驱结点和比较结点

for(i=0;i

{

temp1=(PCB*)malloc(sizeof(PCB));

printf("输入第%d个进程的(id…state)\n",i);

scanf("%d%d%d%d%d%d%s",&temp1->id,&temp1->priority,&temp1->cputime,&temp1->alltime,&temp1->startblock,&temp1->blocktime,temp1->state);

if(i==0)//如果创建的是第一个结点

{

head=temp1;

head->next=NULL;

continue;

}

if(head->prioritypriority)//如果创建结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前

{

temp1->next=head;

head=temp1;

continue;

}

temp2=head;//temp2为比较结点的直接前驱结点

temp3=temp2->next;//temp3为比较的结点

while(temp3!

=NULL&&temp3->priority>=temp1->priority)//实现查找的功能

{

temp2=temp3;

temp3=temp2->next;

}

temp2->next=temp1;

temp1->next=temp3;

}

returnhead;

}

PCB*InsertQueue(PCB*head,PCB*run)//在就绪队列中插入一个结点

{

PCB*temp1,*temp2;//temp1和temp2分别为比较结点的前驱和比较结点

if(head==NULL)//如果就绪队列为空

{

head=run;

head->next=NULL;

}

elseif(head->prioritypriority)//如果插入结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前

{

run->next=head;

head=run;

}

else

{

temp1=head;//temp1为比较结点的直接前驱结点

temp2=temp1->next;//temp2为比较的结点

while(temp2!

=NULL&&temp2->priority>=run->priority)//实现查找的功能

{

temp1=temp2;

temp2=temp1->next;

}

temp1->next=run;

run->next=temp2;

}

returnhead;

}

intmain()

{

intnum;//num为进程的个数

intalltime=0;//用来保存所有进程需要占用的CPU时间

PCB*head;//head为就绪队列的头指针

PCB*run=NULL;//run为执行进程结点的指针

PCB*block=NULL;//block为阻塞进程的结点

PCB*temp;

printf("请输入进程的个数:

");

scanf("%d",&num);

head=CreatQueue(num);

getchar();

temp=head;

while(temp!

=NULL)

{

alltime+=temp->alltime;

temp=temp->next;

}

while(alltime>0)

{

if(head!

=NULL)

{

run=head;//把就绪队列中的第一个进程取出来执行

head=head->next;//就绪队列的头指针指向下一个结点

strcpy(run->state,"run");//状态改为执行

run->next=NULL;

/*显示状态*/

printf("RUNNINGPROG:

%d\n",run->id);//显示执行进程

printf("READY_QUEUE:

");//显示就绪进程

temp=head;

while(temp!

=NULL)

{

printf("->%d",temp->id);

temp=temp->next;

}

printf("\n");

printf("BLOCK_QUEUE:

");//显示阻塞进程

if(block!

=NULL)

{

printf("%d",block->id);

}

printf("\n");

printf("============================================================================\n");

printf("IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE\n");

printf("%d%d%d%d%d%d%s\n",run->id,run->priority,run->cputime,run->alltime,run->startblock,run->blocktime,run->state);

temp=head;

while(temp!

=NULL)

{

printf("%d%d%d%d%d%d%s\n",temp->id,temp->priority,temp->cputime,temp->alltime,temp->startblock,temp->blocktime,temp->state);

temp=temp->next;

}

if(block!

=NULL)

{

printf("%d%d%d%d%d%d%s",block->id,block->priority,block->cputime,block->alltime,block->startblock,block->blocktime,block->state);

}

printf("\n");

printf("============================================================================\n");

/*显示状态*/

/*改变优先数*/

run->priority-=3;//执行进程的优先数减3

temp=head;

while(temp!

=NULL)//就绪进程的优先数加1

{

temp->priority+=1;

temp=temp->next;

}

/*改变优先数*/

/*改变执行进程的有关参数*/

run->cputime+=1;//执行进程的已占用CPU时间加1

run->alltime-=1;//还需要的CPU时间减1

if(run->alltime!

=0)

{

if(run->startblock>0)//如果该进程会被阻塞

{

run->startblock-=1;//执行完一个时间片后,开始阻塞的时间减1

if(run->startblock==0)//如果阻塞的时间到了

{

block=run;//执行转阻塞

strcpy(block->state,"b");//状态转阻塞

alltime--;

printf("\n");

continue;

}

}

strcpy(run->state,"r");//状态转就绪

head=InsertQueue(head,run);//执行转就绪

run=NULL;

}

/*改变执行进程的有关参数*/

alltime--;

}

else

{

/*显示状态*/

printf("RUNNINGPROG:

\n");//显示执行进程

printf("READY_QUEUE:

\n");//显示就绪进程

printf("BLOCK_QUEUE:

");//显示阻塞进程

if(block!

=NULL)

{

printf("%d",block->id);

}

printf("\n");

printf("============================================================================\n");

printf("IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE\n");

if(block!

=NULL)

{

printf("%d%d%d%d%d%d%s",block->id,block->priority,block->cputime,block->alltime,block->startblock,block->blocktime,block->state);

}

printf("\n");

printf("============================================================================\n");

/*显示状态*/

}

/*改变阻塞进程的有关参数*/

if(block!

=NULL)//如果有阻塞进程

{

block->blocktime-=1;//被阻塞的时间减1

if(block->blocktime==0)//如果被阻塞的时间到了

{

strcpy(block->state,"r");//状态转就绪

head=InsertQueue(head,block);//阻塞转就绪

block=NULL;

}

}

/*改变阻塞进程的有关参数*/

getchar();

}

}

 

4、运行结果以及结论

运行结果:

结论:

本次试验感觉难度比较大,有很多生疏的指令。

 但总体上还是对进程概念和进程调度过程有了一个更深的理解。

本实验利用C 语言对动态优先权的进程调度算法进行了设计和模拟实现。

程序可实现动态的进行各个进程相关信息的录入, 如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME 等信息。

考虑了进程在执行过程中可能发生的多种情况, 更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2