优先级调度算法实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

院系:****************学院班级:***********

姓名:***

学号:************

一、实验题目:优先级调度算法

二、实验目的

进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。

三、实验内容

1.设计进程控制块PCB的结构,通常应包括如下信息:

进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。

2.编写优先级调度算法程序

3.按要求输出结果。

四、实验要求

每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。(一)进程控制块结构如下:

NAME——进程标示符

PRIO/ROUND——进程优先数

NEEDTIME——进程到完成还需要的时间片数

STATE——进程状态

NEXT——链指针

注:

1.为了便于处理,程序中进程的的运行时间以时间片为单位进行

计算;

2.各进程的优先数或,以及进程运行时间片数的初值,均由用户在程序运行时给定。

(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN——当前运行进程指针

READY——就需队列头指针

TAIL——就需队列尾指针

FINISH——完成队列头指针

五、实验结果:

六、实验总结:

首先这次实验的难度不小,它必须在熟悉掌握数据结构的链表和队列的前提下才能完成,这次实验中用了三个队列,就绪队列,执行队列和完成队列,就绪队列中的优先级数是有序插入的,当进行进程调度的时候,需要先把就绪队列的队首节点(优先级数最大的节点)移入执行队列中,当执行进程结束后,判断该进程是否已经完成,如果已经完成则移入完成队列,如果没有完成,重新有序插入就绪队列中,这就是这次实验算法的思想。

附录(算法代码):

#include

#include

#include

typedef struct node

{

char name[20]; /*进程的名字*/

int prio; /*进程的优先级*/

//int cputime; /*CPU执行时间*/

int needtime; /*进程执行所需要的时间*/

char state; /*进程的状态,W--就绪态,R--执行态,F--完成态*/

struct node *next; /*链表指针*/

}PCB;

PCB *ready=NULL,*run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/

int num;

void GetFirst(); /*从就绪队列取得第一个节点*/

void Output(); /*输出队列信息*/

void InsertPrio(PCB *in); /*创建优先级队列,规定优先数越小,优先级越高*/ void InsertTime(PCB *in); /*时间片队列*/

void InsertFinish(PCB *in); /*时间片队列*/

void PrioCreate(); /*优先级输入函数*/

//void TimeCreate(); /*时间片输入函数*/

void Priority(); /*按照优先级调度*/

//void RoundRun(); /*时间片轮转调度*/

void main()

{

printf("优先数调度算法\n");

printf("请输入要创建的进程数目:");

scanf("%d",&num);

PrioCreate();

Priority();

Output();

}

void GetFirst() /*取得第一个就绪队列节点*/

{

run = ready;

if(ready!=NULL)

{

run ->state = 'R';

ready = ready ->next;

run ->next = NULL;

}

}

void Output() /*输出队列信息*/

{

PCB *p;

p = ready;

printf("进程名\t优先级\t需要时间\t进程状态\n");

while(p!=NULL)

{

printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);

p = p->next;

}

p = finish;

while(p!=NULL)

{

printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);

p = p->next;

}

p = run;

while(p!=NULL)

{

printf("%s\t%d\t%d\t\t%c\t\n",p->name,p->prio,p->needtime,p->state);

p = p->next;

}

}

void InsertPrio(PCB *in) /*创建优先级队列,规定优先数越小,优先级越低*/ {

PCB *fst,*nxt;

fst = nxt = ready;

if(ready == NULL) /*如果队列为空,则为第一个元素*/

{

in->next = ready;

ready = in;

}

else /*查到合适的位置进行插入*/

{

if(in ->prio >= fst ->prio) /*比第一个还要大,则插入到队头*/

{

in->next = ready;

ready = in;

}

else

{

while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/

相关文档
最新文档