用c语言实现 Exercise 1: 设定系统中有五个进程,每一个进程用一个进程控制块表示。 Exercise 2: 输入每个进程的“优先数”和“要求运行时间”。 Exercise 3: 为了调度方便,将五个进程按给定的优先数从大到小连成就绪队列。用一单元指出队列首进程,用指针指出队列的连接情况。 Exercise 4: 处理机调度总是选队首进程运行。采用动态优先数算法,进程每运行一次优先数就减“1”,同时将运行时间减“1”。 Exercise 5: 若某进程运行时间为零,则将其状态置为“结束”,且退出队列。 Exercise 6: 运行所设计程序,显示或打印逐次被选中进程的进程名,以及进程控制块的动态变化过程。
时间: 2024-02-11 10:06:04 浏览: 68
以下是用C语言实现的程序,实现了Exercise 1至6的要求:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_PROCESS_NUM 5 // 最大进程数
#define MAX_TIME_SLICE 5 // 最大运行时间片
// 进程控制块
typedef struct PCB {
int pid; // 进程ID
int priority; // 优先数
int time_required; // 要求运行时间
int dynamic_priority; // 动态优先数
struct PCB *next; // 指向下一个进程控制块的指针
} PCB;
// 初始化进程控制块
void init_pcb(PCB *pcb, int pid, int priority, int time_required) {
pcb->pid = pid;
pcb->priority = priority;
pcb->time_required = time_required;
pcb->dynamic_priority = priority;
pcb->next = NULL;
}
// 将进程插入就绪队列
void insert_ready_queue(PCB **head, PCB *pcb) {
PCB *p, *q;
if (*head == NULL || pcb->dynamic_priority > (*head)->dynamic_priority) {
pcb->next = *head;
*head = pcb;
} else {
p = *head;
q = p->next;
while (q != NULL && pcb->dynamic_priority <= q->dynamic_priority) {
p = q;
q = q->next;
}
pcb->next = q;
p->next = pcb;
}
}
// 从就绪队列中删除进程
PCB *remove_ready_queue(PCB **head) {
PCB *pcb = *head;
if (*head != NULL) {
*head = (*head)->next;
}
return pcb;
}
// 动态地调整进程的优先级和要求运行时间
void adjust_priority_and_time(PCB *pcb) {
pcb->dynamic_priority--;
pcb->time_required--;
if (pcb->dynamic_priority < 0) {
pcb->dynamic_priority = 0;
}
}
// 显示就绪队列中的进程
void display_ready_queue(PCB *head) {
if (head == NULL) {
printf("Ready queue is empty.\n");
return;
}
printf("Ready queue:");
while (head != NULL) {
printf(" P%d(%d,%d,%d) ->", head->pid, head->priority, head->dynamic_priority, head->time_required);
head = head->next;
}
printf(" NULL\n");
}
int main() {
int i;
PCB *pcb[MAX_PROCESS_NUM];
PCB *ready_queue = NULL;
char process_name[MAX_PROCESS_NUM][3] = {"P0", "P1", "P2", "P3", "P4"};
// 输入每个进程的优先数和要求运行时间
for (i = 0; i < MAX_PROCESS_NUM; i++) {
int priority, time_required;
printf("%s:\n", process_name[i]);
printf("Priority: ");
scanf("%d", &priority);
printf("Time required: ");
scanf("%d", &time_required);
pcb[i] = (PCB *)malloc(sizeof(PCB));
init_pcb(pcb[i], i, priority, time_required);
}
// 将五个进程按给定的优先数从大到小连成就绪队列
for (i = 0; i < MAX_PROCESS_NUM; i++) {
insert_ready_queue(&ready_queue, pcb[i]);
}
// 处理机调度总是选队首进程运行
while (ready_queue != NULL) {
PCB *running_process = remove_ready_queue(&ready_queue);
printf("Running process: %s\n", process_name[running_process->pid]);
adjust_priority_and_time(running_process);
if (running_process->time_required > 0) {
insert_ready_queue(&ready_queue, running_process);
} else {
printf("Process %s is finished.\n", process_name[running_process->pid]);
free(running_process);
}
display_ready_queue(ready_queue);
}
return 0;
}
```
运行程序后,依次输入五个进程的优先数和要求运行时间,程序会将它们按照优先数从大到小的顺序连成就绪队列,并开始动态优先数算法的调度。程序会输出每次运行的进程名,以及进程控制块的动态变化过程。当某个进程的运行时间为零时,程序会将其状态置为“结束”,且从就绪队列中删除。最后程序结束时,会释放所有进程控制块的内存空间。
阅读全文