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

上传人:b****4 文档编号:4795269 上传时间:2022-12-09 格式:DOCX 页数:12 大小:100.13KB
下载 相关 举报
使用动态优先权的进程调度算法的模拟.docx_第1页
第1页 / 共12页
使用动态优先权的进程调度算法的模拟.docx_第2页
第2页 / 共12页
使用动态优先权的进程调度算法的模拟.docx_第3页
第3页 / 共12页
使用动态优先权的进程调度算法的模拟.docx_第4页
第4页 / 共12页
使用动态优先权的进程调度算法的模拟.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

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

《使用动态优先权的进程调度算法的模拟.docx》由会员分享,可在线阅读,更多相关《使用动态优先权的进程调度算法的模拟.docx(12页珍藏版)》请在冰豆网上搜索。

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

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

计算机操作系统

实验报告

 

学号:

姓名:

提交日期:

2017.10.19

成绩:

 

计算机与通信工程学院

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

1实验目的

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

2实验内容

(1)实现对N个进程采用动态优先权优先算法的进程调度。

(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:

进程标识数ID。

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

进程已占用的CPU时间CPUTIME。

进程还需占用的CPU时间ALLTIME。

当进程运行完毕时,ALLTIME变为0。

进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。

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

进程状态STATE。

队列指针NEXT,用来将PCB排成队列。

(3)优先数改变的原则:

进程在就绪队列中停留一个时间片,优先数加1。

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

(4)假设在调度前,系统中有5个进程,它们的初始状态如下:

ID01234

PRIORITY93830290

CPUTIME00000

ALLTIME33634

STARTBLOCK2-1-1-1-1

BLOCKTIME30000

STATEreadyreadyreadyreadyready

(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:

RUNNINGPROG:

i

READY-QUEUE:

->id1->id2

BLOCK-QUEUE:

->id3->id4

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

ID01234

PRIORITYP0P1P2P3P4

CUPTIMEC0C1C2C3C4

ALLTIMEA0A1A2A3A4

STARTBLOCKT0T1T2T3T4

BLOCKTIMEB0B1B2B3B4

STATES0S1S2S3S4

3实验结果

(1)流程图

(2)程序源代码

#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->startb

lock,&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;

}

main()

{

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思考

(1)实际进程调度中,除了按调度算法选择下一个执行的进程外,还需要处理哪些工作?

记录系统中所有进程的执行情况 ,作为进程调度的准备,进程管理模块必须将系统中各个进程的执行特征记录在各个进程的PCB表中。

 进行进程上下文切换 ,一个进程的上下文包括进程的状态,有关变量和数据结构的值。

机器寄存器的值和PCB以及有关程序,数据等。

(2)为什么对进程的优先数可按上述原则进行修改?

最高优先权调度算法仅有利于优先权高的进程,当不断有优先权高的进程需调度时,优先权低的进程将很难得到处理机的处理,所以进程在就绪队列中每呆一个时间片,优先数就增加1,使优先权低的进程不总是忙等,优先权随着时间的递增逐步增大。

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

当前位置:首页 > 求职职场 > 简历

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

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