编写程序完成单处理机系统中的进程调度,要求采用最高优先级优先调度算法。具体内容包括:①确定进程控制块的内容和组织方式;②完成进程创建原语和进程调度原语;③编写主函数对所做的工作进行测试。
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
// 定义进程控制块 PCB
struct pcb {
char name[10]; // 进程名
char state; // 进程状态
int super; // 优先级
int ntime; // 需要运行的时间
int rtime; // 已经运行的时间
struct pcb* link; // 链接指针
};
typedef struct pcb PCB;
// 对进程进行优先级排列的函数
void sort(PCB **ready, PCB *p) {
PCB *first, *second;
int insert = 0;
if ((*ready == NULL) || ((p->super) > (*ready)->super)) { // 优先级最大者, 插入队首
p->link = *ready;
*ready = p;
} else { // 进程比较优先级, 插入适当的位置中
first = *ready;
second = first->link;
while (second != NULL) {
if ((p->super) > (second->super)) { // 若插入进程比当前进程优先数大,
// 插入到当前进程前面
p->link = second;
first->link = p;
second = NULL;
insert = 1;
} else { // 插入进程优先数最低, 则插入到队尾
first = first->link;
second = second->link;
}
}
if (insert == 0) first->link = p;
}
}
// 建立进程控制块函数
void input(PCB **ready) {
int i, num;
system("cls"); // 清屏
printf("\n 请输入进程数:");
scanf("%d", &num);
for (i = 0; i < num; i++) {
printf("\n 进程号No.%d:\n", i);
PCB *p = getpch(PCB);
printf("\n 输入进程名:");
scanf("%s", p->name);
printf("\n 输入进程优先数:");
scanf("%d", &p->super);
printf("\n 输入进程运行时间:");
scanf("%d", &p->ntime);
printf("\n");
p->rtime = 0;
p->state = 'w';
p->link = NULL;
sort(ready, p); // 调用 sort 函数
}
}
// 获取就绪队列长度
int space(PCB *ready) {
int l = 0;
PCB *pr = ready;
while (pr != NULL) {
l++;
pr = pr->link;
}
return l;
}
// 显示当前进程
void disp(PCB *pr) {
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t", pr->name);
printf("|%c\t", pr->state);
printf("|%d\t", pr->super);
printf("|%d\t", pr->ntime);
printf("|%d\t", pr->rtime);
printf("\n");
}
// 建立进程查看函数
void check(PCB **ready) {
PCB *pr;
printf("\n **** 当前正在运行的进程是:%s", (*ready)->name); // 显示当前运行进程
disp(*ready);
pr = (*ready)->link;
printf("\n **** 当前就绪队列状态为:\n"); // 显示就绪队列状态
while (pr != NULL) {
disp(pr);
pr = pr->link;
}
}
// 建立进程撤消函数 (进程运行结束, 撤消进程)
void destroy(PCB **ready) {
printf("\n 进程 [%s] 已完成.\n", (*ready)->name);
PCB *temp = *ready;
*ready = (*ready)->link;
free(temp);
}
// 建立进程就绪函数 (进程运行时间到, 置就绪状态)
void running(PCB **ready) {
(*ready)->rtime++; // 进程运行时间增加
if ((*ready)->rtime == (*ready)->ntime) {
destroy(ready); // 调用 destroy 函数
} else {
(*ready)->super--; // 降低优先级
(*ready)->state = 'w'; // 设置为就绪状态
sort(ready, *ready); // 调用 sort 函数
}
}
// 主函数
int main() {
int len, h = 0;
char ch;
PCB *ready = NULL;
input(&ready);
len = space(ready);
while ((len != 0) && (ready != NULL)) {
ch = getchar();
h++;
printf("\n The execute number:%d \n", h);
PCB *p = ready;
ready = p->link;
p->link = NULL;
p->state = 'R';
check(&ready);
running(&ready);
printf("\n 按任一键继续......");
ch = getchar();
}
printf("\n\n 进程已经完成.\n");
ch = getchar();
return 0;
}