使用动态优先权的进程调度算法的模拟实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用动态优先权的进程调度算法的模拟实验
1.实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2.实验内容
(1)用C语言实现对N个进程采用动态优先权优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数;
进程优先数priority,并规定优先数越大的进程,其优先权越高;
进程状态state;
队列指针next,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1.
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们得初始状态如下:
ID01234
PRIORITY9 38 30290
CPUTIME 00000
ALLTIME33634
STARTBLOCK2-1-1-1-1
BLOCKTIME30000
STATEREADYREADYREADYREADYREADY
(5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNING PROG:i
READY_QUEUE:->id1->id2
BLOCK_QUEUE:->id3->id4
}PCB;
PCB *CreatQueue(int num) //创建一个就绪队列
{
int i; //i为循环计数器
PCB *head, *temp1, *temp2, *temp3; //head为就绪队列的头指针,temp1为创建进程结点的指针,temp2、temp3分别为比较结点的前驱结点和比较结点
int cputime; //ຫໍສະໝຸດ Baidu程已占用的CPU时间
int alltime; //进程还需占用的CPU时间
int startblock; //进程的阻塞时间
int blocktime; //进程被阻塞的时间
char state[10]; //进程状态
struct node *next; //队列指针
head=temp1;
continue;
}
temp2=head; //temp2为比较结点的直接前驱结点
temp3=temp2->next; //temp3为比较的结点
while(temp3!=NULL && temp3->priority>=temp1->priority) //实现查找的功能
{
temp2=temp3;
======================================================================
ID01234
PRIORITYP0 P1 P2P3 P4
CPUTIME C0C1C3C4C5
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
进程已占用的CPU时间cputime;
进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;
进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
进程被阻塞的时间blicktime,表示已阻塞的进程再等待blocktime个时间片后,将转换为就绪态;
}
else
{
temp1=head; //temp1为比较结点的直接前驱结点
temp2=temp1->next; //temp2为比较的结点
while(temp2!=NULL && temp2->priority>=run->priority) //实现查找的功能
{
temp1=temp2;
temp2=temp1->next;
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3.过程(流程图)
4.代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int id; //进程标识数
int priority; //进程优先数,优先数越大优先级越高
if(i==0) //如果创建的是第一个结点
{
head=temp1;
head->next=NULL;
continue;
}
if(head->priority < temp1->priority) //如果创建结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
{
temp1->next=head;
}
temp1->next=run;
run->next=temp2;
}
return head;
}
main()
{
int num; //num为进程的个数
int alltime=0; //用来保存所有进程需要占用的CPU时间
PCB *head; //head为就绪队列的头指针
PCB *run=NULL; //run为执行进程结点的指针
if(head==NULL) //如果就绪队列为空
{
head=run;
head->next=NULL;
}
else if(head->priority < run->priority) //如果插入结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
{
run->next=head;
head=run;
temp3=temp2->next;
}
temp2->next=temp1;
temp1->next=temp3;
}
return head;
}
PCB *InsertQueue(PCB *head,PCB *run) //在就绪队列中插入一个结点
{
PCB *temp1,*temp2; //temp1和temp2分别为比较结点的前驱和比较结点
for(i=0; i<num; 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);
1.实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
2.实验内容
(1)用C语言实现对N个进程采用动态优先权优先算法的进程调度;
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数;
进程优先数priority,并规定优先数越大的进程,其优先权越高;
进程状态state;
队列指针next,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1.
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们得初始状态如下:
ID01234
PRIORITY9 38 30290
CPUTIME 00000
ALLTIME33634
STARTBLOCK2-1-1-1-1
BLOCKTIME30000
STATEREADYREADYREADYREADYREADY
(5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNING PROG:i
READY_QUEUE:->id1->id2
BLOCK_QUEUE:->id3->id4
}PCB;
PCB *CreatQueue(int num) //创建一个就绪队列
{
int i; //i为循环计数器
PCB *head, *temp1, *temp2, *temp3; //head为就绪队列的头指针,temp1为创建进程结点的指针,temp2、temp3分别为比较结点的前驱结点和比较结点
int cputime; //ຫໍສະໝຸດ Baidu程已占用的CPU时间
int alltime; //进程还需占用的CPU时间
int startblock; //进程的阻塞时间
int blocktime; //进程被阻塞的时间
char state[10]; //进程状态
struct node *next; //队列指针
head=temp1;
continue;
}
temp2=head; //temp2为比较结点的直接前驱结点
temp3=temp2->next; //temp3为比较的结点
while(temp3!=NULL && temp3->priority>=temp1->priority) //实现查找的功能
{
temp2=temp3;
======================================================================
ID01234
PRIORITYP0 P1 P2P3 P4
CPUTIME C0C1C3C4C5
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4
进程已占用的CPU时间cputime;
进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0;
进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞状态;
进程被阻塞的时间blicktime,表示已阻塞的进程再等待blocktime个时间片后,将转换为就绪态;
}
else
{
temp1=head; //temp1为比较结点的直接前驱结点
temp2=temp1->next; //temp2为比较的结点
while(temp2!=NULL && temp2->priority>=run->priority) //实现查找的功能
{
temp1=temp2;
temp2=temp1->next;
BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3.过程(流程图)
4.代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int id; //进程标识数
int priority; //进程优先数,优先数越大优先级越高
if(i==0) //如果创建的是第一个结点
{
head=temp1;
head->next=NULL;
continue;
}
if(head->priority < temp1->priority) //如果创建结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
{
temp1->next=head;
}
temp1->next=run;
run->next=temp2;
}
return head;
}
main()
{
int num; //num为进程的个数
int alltime=0; //用来保存所有进程需要占用的CPU时间
PCB *head; //head为就绪队列的头指针
PCB *run=NULL; //run为执行进程结点的指针
if(head==NULL) //如果就绪队列为空
{
head=run;
head->next=NULL;
}
else if(head->priority < run->priority) //如果插入结点中所保存的数比头结点所保存的数要大,则直接把该结点插入到头结点之前
{
run->next=head;
head=run;
temp3=temp2->next;
}
temp2->next=temp1;
temp1->next=temp3;
}
return head;
}
PCB *InsertQueue(PCB *head,PCB *run) //在就绪队列中插入一个结点
{
PCB *temp1,*temp2; //temp1和temp2分别为比较结点的前驱和比较结点
for(i=0; i<num; 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);