操作系统实验——动态优先级进程调度实验报告

操作系统实验——动态优先级进程调度实验报告
操作系统实验——动态优先级进程调度实验报告

操作系统实验——动态优先级进程调度实验报

-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++;

相关主题
相关文档
最新文档