编写程序完成单处理机系统中的进程调度,要求采用最高优先级优先调度算法。具体内容包括:①确定进程控制块的内容和组织方式;②完成进程创建原语和进程调度原语;③编写主函数对所做的工作进行测试。
#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;
}