实验名称:
动态优先权调度过程中就绪队列的模拟
实验要求:
采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。
实验内容:
(1)每个进程控制块PCB用结构描述,包括以下字段:
*进程标识符id
*进程优先数priority,并规定优先数越大的进程,其优先权越高。
*进程已占用的CPU时间cputime
*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0
*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态
*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime 个时间片后,将转换成就绪状态
*进程状态state
*队列指针next,将PCB排成队列。
(2)调度前,系统中有五个进程,它们的初始状态如下:
(3)进程在就绪队列呆一个时间片,优先数增加1。
(4)进程每运行一个时间片,优先数减3。
程序源代码
#include <stdio.h>
#include <stdlib.h>
#define LEN 5 // 进程最大数量
typedef enum STATE // 进程状态
{
RUN, // 运行
READY, // 就绪
BLOCK, // 阻塞
END // 完成
}STATE;
// 定义进程控制块
typedef struct PCB {
int id; // 进程标识符
int priority; // 进程优先级
int cputime; // 已占用的CPU时间
int alltime; // 还需占用的CPU时间
int startblock; // 阻塞时间
int blocktime; // 被阻塞时间
STATE state; // 进程状态
struct PCB *next;
}PCB;
PCB* head; // 链表头指针
int time; // 时间片数量
// 初始化
void init() {
head = NULL;
time = 0;
int id = 0;
PCB* temp;
PCB* rear;
// 创建5个进程控制块
while (id < LEN) {
temp = (PCB *)malloc(sizeof(PCB));
temp->id = id;
temp->next = NULL;
if (head == NULL) {
head = temp;
rear = temp;
}
else {
rear->next = temp;
rear = temp;
}
id++;
}
// 给进程赋值
for (PCB* i = head; i != NULL; i = i->next) {
i->state = READY;
i->cputime = 0;
i->alltime = 3;
i->blocktime = 0;
i