当前位置:文档之家› 使用动态优先权的进程调度算法的模拟实验

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

{
int i;//i为循环计数器
PCB *head,*temp1,*temp2, *temp3;//head为就绪队列的头指针,temp1为创建进程结点的指针,temp2、temp3分别为比较结点的前驱结点和比较结点
for(i=0;i<num;i++)//根据进程的个数创建结点并按从大到小的顺序进行排序
使用动态优先权的进程调度算法的模拟实验
———————————————————————————————— 作者:
———————————————————————————————— 日期:

使用动态优先权的进程调度算法的模拟实验
1.实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2.实验内容
3.过程(流程图)
4.代码
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
typedef structnode
{
int id;//进程标识数
ﻩintpriority;//进程优先数,优先数越大优先级越高
int cputime;//进程已占用的CPU时间
ﻩtemp2=temp1->next;
}
temp1->next=run;
STATEﻩREADYREADYﻩREADYREADYREADY
(5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNINGPROG:i
READY_QUEUE:->id1->id2
BLOCK_QUEUE:->id3->id4
======================================================================
ﻩint alltime;//进程还需占用的CPU时间
ﻩintstartblock;//进程的阻塞时间
ﻩintblocktime;//进程被阻塞的时间
charstate[10];//进程状态
struct node*next;//队列指针
}PCB;
PCB *CreatQueue(intnum)//创建一个就绪队列

ﻩﻩﻩtemp2=temp3;
ﻩﻩﻩtemp3=temp2->next;

ﻩﻩtemp2->next=temp1;
temp1->next=temp3;
ﻩ}
ﻩreturn head;
}
PCB *InsertQueue(PCB*head,PCB *run)//在就绪队列中插入一个结点
{
PCB *temp1,*temp2;//temp1和temp2分别为比较结点的前驱和比较结点
进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
进程被阻塞的时间blicktime,表示已阻塞的进程再等待blocktime个时间片后,将转换为就绪态;
进程状态state;
队列指针next,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1.
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们得初始状态如下:
ID ﻩ01ﻩﻩ23ﻩﻩ4
PRIORITY93830ﻩﻩ29ﻩ0
CPUTIME00ﻩﻩ0ﻩﻩ00
ALLTIME33ﻩ6ﻩ3ﻩﻩ4
STARTBLOCK2-1ﻩﻩ-1-1ﻩﻩ-1
BLOCKTIME30ﻩ0ﻩ0ﻩ0
ﻩ{
ﻩﻩ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);
}
ﻩelse
ﻩ{
temp1=head;//temp1为比较结点的直接前驱结点
ﻩ temp2=temp1->next;//temp2为比较的结点
ﻩ while(temp2!=NULL && temp2->priority>=run->priority)//实现查找的功能
ﻩ{
ﻩﻩtemp1=temp2;
IDﻩ0ﻩﻩ12ﻩﻩ3ﻩ4
PRIORITYﻩ ﻩP0 P1P2P3P4
CPUTIMEC0ﻩﻩC1ﻩC3ﻩﻩC4ﻩﻩC5
ALLTIMEﻩA0ﻩA1ﻩA2ﻩﻩA3ﻩﻩA4
STARTBLOCKT0ﻩT1ﻩT2ﻩT3ﻩT4
BLOCKTIMEﻩB0ﻩﻩB1ﻩB2B3ﻩB4
STATES0S1ﻩﻩS2ﻩS3ﻩS4
ﻩif(head==NULL)//如果就绪队列为空
ﻩ{
ﻩhead=run;
head->next=NULL;

elseif(head->priority< run->priority)//如果插入结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
{
ﻩrun->next=head;
ﻩhead=run;
ﻩhead=temp1;
continue;
ﻩﻩ}
ﻩtemp2=head;//temp2为比较结点的直接前驱结点
ﻩtemp3=temp2->next;//temp3为比较的结点
ﻩﻩwhile(temp3!=NULL&& temp3->priority>=temp1->priority) //实现查找的功能
(1)用C语言实现对N个进程采用动态优先权优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数;
进程优先数priority,并规定优先数越大的进程,其优先权越高;
进程已占用的CPU时间cputime;
进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;
ﻩif(i==0)//如果创建的是第一个结点
ﻩﻩ{
ﻩﻩhead=temp1;
ห้องสมุดไป่ตู้head->next=NULL;
continue;
ﻩ}
ﻩﻩif(head->priority < temp1->priority)//如果创建结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
ﻩﻩ{
temp1->next=head;
相关主题