实验四使用动态优先权的进程调度算法的模拟.
实验四 使用动态优先权的进程调度算法的模拟
专业班级: 软件1302 学号: 201316920224 姓名: 张长胜 评分:
实验目的
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
实验内容
用C语言来实现对N个进程采用动态优先权优先算法的进程调度。
每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
进程标识数ID;
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高;
进程已占用的CPU时间CPUTIME;
进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0;
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态;
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,进程将转换成就绪状态;
进程状态STATE;
队列指针NEXT,用来将PCB排成队列。
优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1;
进程每运行一个时间片,优先数减3。
假设在调度前,系统中有5个进程,它们的初始状态如下:
ID01234
PRIORITY93830290
CPUTIME00000
ALLTIME33634
STARTBLOCK2-1-1-1-1
BLOCKTIME30000
STATEREADYREADYREADYREADYREADY
为了清楚地观察进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:
RUNNING PROG: i
READY_QUEUE:->id1->id2
BLOCK_QUEUE:->id3->id4
===============================================
ID01234
PRIORITYP0P1P2P3P4
CPUTIMEC0C1C2C3C4
ALLTIMEA0A1A2A3A4
STARTBLOCKT0T1T2T3T4BLOCKTIMEB0B1B2B3B4
STATES0S1S2S3S4
3.程序设计
/*define the structure of process*/
#include
#define N 10
#define P proc
struct process
{ int id;
int py;/*priority*/
int ct;/*cputime*/
int at;/*alltime*/
int sb;/*startblock*/
int bt;/*blocktime*/
int st;/*state:1 ready;-1 block;0 finish*/
};
struct process proc[N];
main()
{ int i,j,n;
int max_pt,priority;
int timeslice=0;
int ready_q[N],block_q[N];
char ch;
FILE *fp;
char *fname="c:\\a.txt";
fp=fopen(fname,"w+");
for(i=0;i<=N;i++)
{ ready_q[i]=0; block_q[i]=0;
}
n=5; /* 定义进程数量为5 */
/* 初始化进程数组 */
P[1].id=0; P[1].py=9; P[1].ct=0; P[1].at=3; P[1].sb=2; P[1].bt=3;
P[2].id=1; P[2].py=38; P[2].ct=0; P[2].at=3; P[2].sb=-1; P[2].bt=0;
P[3].id=2; P[3].py=30; P[3].ct=0; P[3].at=6; P[3].sb=-1; P[3].bt=0;
P[4].id=3; P[4].py=29; P[4].ct=0; P[4].at=3; P[4].sb=-1; P[4].bt=0;
P[5].id=4; P[5].py=0; P[5].ct=0; P[5].at=4; P[5].sb=-1; P[5].bt=0;
/* 输出初始化的进程数组内容 */
fprintf(fp,"\n\n