操作系统实验——动态优先级进程调度实验报告
操作系统实验——动态优先级进程调度实验报
告
-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN
1.实验名称:
动态优先权调度过程中就绪队列的模拟
2.实验要求:
采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。
3.实验内容:
(1)每个进程控制块PCB用结构描述,包括以下字段:
*进程标识符id
*进程优先数priority,并规定优先数越大的进程,其优先权越高。
*进程已占用的CPU时间cputime
*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0
*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态
*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime 个时间片后,将转换成就绪状态
*进程状态state
*队列指针next,将PCB排成队列。
(2)调度前,系统中有五个进程,它们的初始状态如下:
(3)进程在就绪队列呆一个时间片,优先数增加1。
(4)进程每运行一个时间片,优先数减3。
(5)按下面格式显示每个时间片内就绪队列的情况:
READY_QUEUE :->id1->id2
4.任务分析
进程控制块用结构体来表示,包含它的各项属性。建立两个队列:一个就绪队列,一个阻塞队列。创建一个进程控制块表示当前正在运行的进程。程序开始运行时,所有进程都在就绪队列中。当startblock减少到0时,进程进入阻塞队列。在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。
5.程序流程图
6.程序清单
#include
#include
using namespace std;
#define LEN 5 d = i;
ps[i].state = READY;
ps[i].cputime = 0;
ps[i].alltime = 3;
ps[i].blocktime = 0;
ps[i].startblock = -1;
}
ps[0].priority = 9;
ps[1].priority = 38;
ps[2].priority = 30;
ps[3].priority = 29;
ps[4].priority = 0;
ps[2].alltime = 6;
ps[4].alltime = 4;
ps[0].startblock = 2;
ps[0].blocktime = 3;
cp = NULL; d <<"\t";
}
cout <<"\nPRIORITY\t";
for (int i = 0; i < LEN; i++) {
cout << ps[i].priority <<"\t";
}
cout <<"\nCPUTIME\t\t";
for (int i = 0; i < LEN; i++) {
cout << ps[i].cputime <<"\t";
}
cout <<"\nALLTIME\t\t";
for (int i = 0; i < LEN; i++) {
cout << ps[i].alltime <<"\t";
}
cout <<"\nSTARTBLOCK\t";
for (int i = 0; i < LEN; i++) {
cout << ps[i].startblock <<"\t";
}
cout <<"\nBLOCKTIME\t";
for (int i = 0; i < LEN; i++) {
cout << ps[i].blocktime <<"\t";
}
cout <<"\nSTATE\t\t";
for (int i = 0; i < LEN; i++) {
if (ps[i].state == READY) {
cout <<"READY"<<"\t";
}
else if (ps[i].state == BLOCK) {
cout <<"BLOCK"<<"\t";
}
else if (ps[i].state == END) {
cout <<"END"<<"\t";
}
}
cout << endl;
}
// 出队,返回进程指针
PCB* pop(Queue *q) {
PCB *temp;
if (q->size > 0) {
temp = q->data[0]; // 取出队首进程
for (int i = 0; i < q->size - 1; i++) {
q->data[i] = q->data[i + 1]; // 其他进程依次向前移动}
q->size--;
return temp; // 返回队首进程
}
return NULL;
}
// 入队
void push(Queue *q, PCB *p) {
if (q->size < LEN) {
q->data[q->size] = p; // 将入队的进程放在队尾
q->size++;