实验 3 高(动态 )优先权优先的进程调度算法模拟
实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
实验环境
装有操作系统 Windows XP和开发工具 VC++6.0,内存在256M以上的微机; 或者:装有Linux(Fedora 7)操作系统和gcc编译器,内存在256M以上的微机。
实验内容
用C语言来实现对N个进程采用动态优先权优先算法的进程调度。
每个用来标识进程的进程控制块 PCB用结构来描述,包括以下字段:
进程标识数 ID; 进程优先数PRIORITY并规定优先数越大的进程,其优先权越高;
进程已占用的 CPU时间CPUTIME;
进程还需占用的 CPU时间NEEDTIME当进程运行完毕时, NEEDTIME变为0; 进程的阻塞时间STARTBLOCK表示当进程再运行 STARTBLOC个时间片后,进 程将进入阻塞状态;
进程被阻塞的时间 BLOCKTIME表示已阻塞的进程再等待BLOCKTIME个时间
片后,进程将转换成就绪状态;
进程状态 STATE; (READY,RUNNING, BLOCK, FINISH) 队列指针NEXT,用来将PCB排成队列。
优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加 1;
进程每运行一
个时间片,优先数减
,、.
3。
(4) 假设在调度前,系统中有
5 个进程,它们的初始状态如下:
ID
0
1
2
3
4
PRIORITY
9
38
30
29
0
CPUTIME
0
0
0
0
0
NEEDTIME
3
3
6
3
4
STARTBLOCK
2
-1
-1
-1
-1
BLOCKTIME
3
0
0
0
0
STATE
READY
READY
READY
READY
READY
(5) 为了清楚地观察进程的调度过程,程序应将每个时间片内的进程的情况显示出来, 参照的具体格式如下:
RUNNING PROCESS: $id0
READY QUEUE: $id1->$id2
BLOCK QUEUE: $id3->$id4
FINISH QUEUE: $id0->$id1->$id2->$id3->$id4
ID
PRIORITY
CPUTIME
NEEDTIME
STATE
STARTBLOCK
BLOCKTIME
0
XX
XX
XX
XX
XX
XX
1
XX
XX
XX
XX
XX
XX
2
XX
XX
XX
XX
XX
XX
3
XX
XX
XX
XX
XX
XX
4
XX
XX
XX
XX
XX
XX
实验要求
(1) 将源程序 (priority.c) 和程序运行结果写入实验报告。
(2) 将该算法执行过程与高响应比优先调度算法的执行过程进行比较。
#include
#include using namespace std;
int i;// 循环值
int j;// 还在阻塞或就绪队列中的进程数
int s;
int m; // 最大 priority 的 id struct pcb
{
int id;
int p; //priority
int cputime;
int alltime;
int startblock;
int blocktime;
int state; //0 表示 ready 1 表示 end -1 表示 block };
struct pcb pro[5]={
{0,9,0,3,2,3,0},
{1,38,0,3,-1,0,0},
{2,30,0,6,-1,0,0},
{3,29,0,3,-1,0,0},
{4,0,0,4,-1,0,0}
};
int changestate0()
{
if(pro[0].startblock==0) {
pro[0].state=-1; pro[0].startblock--; return 1;
if(pro[0].blocktime==0) pro[0].state=0;
return 1;
} if(pro[0].state==0&&pro[0].startblock!=-1) {
pro[0].startblock--;return 1;}
if(pro[0].state==-1&&pro[0].blocktime!=0) {
pro[0].blocktime--;return 1;
}
}
int state0()
{
changestate0();
s=pro[0].p;
if(pro[0].state==-1)
s=-100;
return s;
}
int maxp()// 求出最大 priority
{
state0();
int max=s;
m=pro[0].id;
for(i=0;i