操作系统实验指导
执笔:胡荣 教研室:信息与计算科学教研室
实验一 进程调度实验
一、
实验目的
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算
法的理解. 二、
实验学时
2学时 三、
实验要求
编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法中的静态优先数调度对五个进程进行调度。 (实验要求后附了动态优先数调度实现的源码,要求将其修改成静态优先数调度)
四、 算法描述
“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等。动态优先数调度算法流程图如下:
1
进程调度源程序如下: #include \#include
#define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0
2
struct pcb { /* 定义进程控制块PCB */ char name[10]; char state; int super; int ntime; int rtime; struct pcb* link; }*ready=NULL,*p; typedef struct pcb PCB;
sort() /* 建立对进程进行优先级排列函数*/
{
PCB *first, *second; int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/ {
p->link=ready; ready=p; }
else /* 进程比较优先级,插入适当的位置中*/ {
3
first=ready; second=first->link; while(second!=NULL) {
if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p;
second=NULL; insert=1; }
else /* 插入进程优先数最低,则插入到队尾*/ {
first=first->link; second=second->link; } }
if(insert==0) first->link=p; }
}
4

