搜档网
当前位置:搜档网 › 昆明理工大学进程管理实验报告

昆明理工大学进程管理实验报告

昆明理工大学进程管理实验报告
昆明理工大学进程管理实验报告

昆明理工大学信息工程与自动化学院学生实验报告

(2010 —2011 学年第二学期)

目录

一、实验目的 (1)

二、实验原理及基本技术路线图 (2)

1.进程的状态转换图 (2)

2.各原语的功能说明 (2)

3.多级反馈队列调度算法的描述 (3)

4.程序功能结构图 (4)

5.流程图 (4)

6.数据结构定义 (5)

7.主要变量的说明 (6)

8.函数的说明 (6)

四、实验方法、步骤 (6)

五、实验过程原始记录 (18)

六、实验结果、分析和结论 (21)

一、实验目的

通过编写进程管理的算法,要求学生掌握整个进程管理的各个环节,进程的数据结构描述,进程的各种状态之间的转换,以及进程的调度算法。以加深对进程的概念及进程调度算法的理解,并且提高链表的应用能力,达到提高编程能力的目的。

二、实验原理及基本技术路线图(方框原理图)

用C语言或C++语言开发。需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。要求有创建、撤销、调度、阻塞、唤醒进程等功能。

1.进程的状态转换图:

2.各原语的功能说明:

-进程创建原语:进程创建是调用创建原语来实现。创建原语扫描系统的PCB链表,

在找到一定PCB 链表之后,填入调用者提供的有关参数(这些参数包括:进程名、进程优先级P0、进程正文段起始地址d0、资源清单R0等),最后形成代表进程的PCB结构。

-进程撤销(终止): 撤消原语首先检查PCB进程链或进程家族,寻找所要撤消的进程是否存在。如果找到了所要撤消的进程的PCB结构,则撤消原语释放该进程所占有的资源之后,把对应的PCB结构从进程链或进程家族中摘下并返回给PCB空队列。如果被撤消的进程有自己的子进程,则撤消原语先撤消其子进程的PCB结构并释放子进程所占用的资源之后,再撤消当前进程的PCB结构和释放其资源。

-阻塞原语:当发生引起阻塞的事件时,该原语被该进程自己调用来阻塞自己。阻塞原语在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的CPU 现场。然后将被阻塞进程置“阻塞”状态后插入等待队列中,再转进程调度程序选择新的就绪进程投入运行。

-唤醒原语:当等待队列中的进程所等待的事件发生时,等待该事件的所有进程都将被唤醒。一个处于阻塞状态的进程不可能自己唤醒自己。唤醒一个进程有两种方法:一种是由系统进程唤醒。另一种是由事件发生进程唤醒。当由系统进程唤醒等待进程时,系统进程统一控制事件的发生并将“事件发生”这一消息通知等待进程。从而使得该进程因等待事件已发生而进入就绪队列。等待进程也可由事件发生进唤醒。由事件发生进程唤醒时,事件发生进程和被唤醒进程之间是合作关系。因此,唤醒原语既可被系统进程调用,也可被事件发生进程调用。我们称调用唤醒原语的进程为唤醒进程。

3.多级反馈队列调度算法的描述:

(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。图3-5 是多级反馈队列算法的示意。

(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则

等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n队列中便采取按时间片轮转的方式运行。

(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1) 队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。

4.程序功能结构图:

5.流程图:

6.数据结构定义:

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

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

int round; /*分配CPU的时间片*/

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

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

char state; /*进程的状态,W——就绪态,R——执行态,F——完成态*/ int count; /*记录执行的次数*/

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

7.主要变量的说明:

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

int num; /*进程个数*/

int ReadyNum; /*就绪队列个数*/

8.函数的说明:

void Output(); /*进程信息输出函数*/

void InsertFinish(PCB *in); /*将进程插入到完成队列尾部*/

void Insertsupernumber(ReadyQueue *in); /*创建就绪队列,规定优先数越小,优先级越低*/

void supernumberCreate(); /*创建就绪队列输入函数*/

void GetFirst(ReadyQueue *queue); /*取得某一个就绪队列中的队头进程*/

void InsertLast(PCB *in,ReadyQueue *queue); /*将进程插入到就绪队列尾部*/

void ProcessCreate(); /*进程创建函数*/

void RoundRun(ReadyQueue *timechip); /*时间片轮转调度算法*/

void MultiDispatch(); /*多级调度算法,每次执行一个时间片*/

三、三、所用仪器、材料(设备名称、型号、规格等)。

计算机一台

四、实验方法、步骤

# include

# include

# include

# include

typedef struct node /*进程节点信息*/

{

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

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

int round; /*分配CPU的时间片*/

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

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

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

int count; /*记录执行的次数*/

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

}PCB;

typedef struct Queue /*多级就绪队列节点信息*/

{

PCB *LinkPCB; /*就绪队列中的进程队列指针*/

int supernumber; /*本就绪队列的优先级*/

int round; /*本就绪队列所分配的时间片*/

struct Queue *next; /*指向下一个就绪队列的链表指针*/

}ReadyQueue;

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

int num; /*进程个数*/

int ReadyNum; /*就绪队列个数*/

void Output(); /*进程信息输出函数*/

void InsertFinish(PCB *in); /*将进程插入到完成队列尾部*/

void Insertsupernumber(ReadyQueue *in); /*创建就绪队列,规定优先数越小,优先级越低*/

void supernumberCreate(); /*创建就绪队列输入函数*/

void GetFirst(ReadyQueue *queue); /*取得某一个就绪队列中的队头进程*/

相关主题