#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_PROCESSES 10 // 进程状态枚举 typedef enum { READY, // 就绪态 RUNNING, // 运行态 FINISHED // 完成态 } ProcessState; // 进程控制块 PCB typedef struct { char name[20]; // 进程名 int priority; // 优先数(数值越大优先级越高) int needTime; // 需要运行的时间 int runTime; // 已运行时间 int waitTime; // 等待时间 ProcessState state; // 状态 int arrivalTime; // 到达时间 } PCB; PCB processes[MAX_PROCESSES]; int processCount = 0; // 显示进程信息表头 void printHeader() { } // 显示单个进程信息 void printProcess(PCB *p) { char *stateStr; switch(p->state) { case READY: stateStr = "就绪态"; break; case RUNNING: stateStr = "运行态"; break; case FINISHED: stateStr = "完成态"; break; default: stateStr = "未知"; break; } p->name, p->priority, p->needTime, p->runTime, p->waitTime, stateStr); } // 显示所有进程 void printAllProcesses() { printHeader(); for (int i = 0; i < processCount; i++) { printProcess(&processes[i]); } } // 显示就绪队列 void printReadyQueue() { int hasReady = 0; for (int i = 0; i < processCount; i++) { if (processes[i].state == READY) { hasReady = 1; } } } // 按优先级排序(冒泡排序,降序) void sortByPriority() { for (int i = 0; i < processCount - 1; i++) { for (int j = 0; j < processCount - i - 1; j++) { // 只比较就绪态的进程,且按优先级降序排列 if (processes[j].state == READY && processes[j+1].state == READY) { if (processes[j].priority < processes[j+1].priority) { PCB temp = processes[j]; processes[j] = processes[j+1]; processes[j+1] = temp; } } } } } // 找到优先级最高的就绪进程 int findHighestPriority() { int maxPriority = -999; int index = -1; for (int i = 0; i < processCount; i++) { if (processes[i].state == READY && processes[i].priority > maxPriority) { maxPriority = processes[i].priority; index = i; } } return index; } // 增加等待进程的等待时间和优先级(可选:等待过久提升优先级) void updateWaitingProcesses() { for (int i = 0; i < processCount; i++) { if (processes[i].state == READY) { processes[i].waitTime++; // 如果等待时间超过3个时间片,优先数加1(防止饥饿) if (processes[i].waitTime > 3 && processes[i].priority < 10) { processes[i].priority++; processes[i].name, processes[i].priority); } } } } // 调度一个时间片 void scheduleOneSlice() { int idx = findHighestPriority(); if (idx == -1) { return; } // 将选中的进程设为运行态 processes[idx].state = RUNNING; processes[idx].name, processes[idx].priority, processes[idx].needTime); // 运行一个时间片 processes[idx].runTime++; processes[idx].needTime--; // 显示运行中的状态 printAllProcesses(); printReadyQueue(); // 动态优先数:运行后优先数减1 processes[idx].priority--; // 检查是否完成 if (processes[idx].needTime <= 0) { processes[idx].state = FINISHED; } else { // 未完成,回到就绪态 processes[idx].state = READY; processes[idx].name, processes[idx].priority); } // 更新等待进程 updateWaitingProcesses(); } // 检查是否所有进程都已完成 int allFinished() { for (int i = 0; i < processCount; i++) { if (processes[i].state != FINISHED) { return 0; } } return 1; } // 初始化进程(直接写入程序中,无需输入) void initProcesses() { // 进程1: aa processes[0].priority = 5; processes[0].needTime = 8; processes[0].runTime = 0; processes[0].waitTime = 0; processes[0].state = READY; processes[0].arrivalTime = 0; // 进程2: bb processes[1].priority = 3; processes[1].needTime = 6; processes[1].runTime = 0; processes[1].waitTime = 0; processes[1].state = READY; processes[1].arrivalTime = 0; // 进程3: cc processes[2].priority = 8; processes[2].needTime = 10; processes[2].runTime = 0; processes[2].waitTime = 0; processes[2].state = READY; processes[2].arrivalTime = 0; processCount = 3; } int main() { // 初始化进程 initProcesses(); printAllProcesses(); printReadyQueue(); // 开始调度 int slice = 1; while (!allFinished()) { scheduleOneSlice(); } printAllProcesses(); return 0; }
Standard input is empty
============================================================
进程调度模拟程序 - 最高优先数优先算法
============================================================
【算法说明】
- 采用动态优先数调度
- 每次调度优先级最高的就绪进程
- 运行一个时间片后优先数减1
- 等待超3个时间片的进程优先级+1(防止饥饿)
【初始进程信息】
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 8 | 0 | 0 | 就绪态 |
| bb | 3 | 6 | 0 | 0 | 就绪态 |
| cc | 8 | 10 | 0 | 0 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:5) -> bb(优先级:3) -> cc(优先级:8)
******************** 第 1 次调度 ********************
========================================
【调度进程: cc】 优先级: 8, 还需时间: 10
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 8 | 0 | 0 | 就绪态 |
| bb | 3 | 6 | 0 | 0 | 就绪态 |
| cc | 8 | 9 | 1 | 0 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:5) -> bb(优先级:3)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 7)
******************** 第 2 次调度 ********************
========================================
【调度进程: cc】 优先级: 7, 还需时间: 9
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 8 | 0 | 1 | 就绪态 |
| bb | 3 | 6 | 0 | 1 | 就绪态 |
| cc | 7 | 8 | 2 | 1 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:5) -> bb(优先级:3)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 6)
******************** 第 3 次调度 ********************
========================================
【调度进程: cc】 优先级: 6, 还需时间: 8
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 8 | 0 | 2 | 就绪态 |
| bb | 3 | 6 | 0 | 2 | 就绪态 |
| cc | 6 | 7 | 3 | 2 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:5) -> bb(优先级:3)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 5)
******************** 第 4 次调度 ********************
========================================
【调度进程: aa】 优先级: 5, 还需时间: 8
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 7 | 1 | 3 | 运行态 |
| bb | 3 | 6 | 0 | 3 | 就绪态 |
| cc | 5 | 7 | 3 | 3 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:3) -> cc(优先级:5)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 4)
>> aa 等待过久,优先级提升为 5
>> bb 等待过久,优先级提升为 4
>> cc 等待过久,优先级提升为 6
******************** 第 5 次调度 ********************
========================================
【调度进程: cc】 优先级: 6, 还需时间: 7
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 5 | 7 | 1 | 4 | 就绪态 |
| bb | 4 | 6 | 0 | 4 | 就绪态 |
| cc | 6 | 6 | 4 | 4 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:5) -> bb(优先级:4)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 5)
>> aa 等待过久,优先级提升为 6
>> bb 等待过久,优先级提升为 5
>> cc 等待过久,优先级提升为 6
******************** 第 6 次调度 ********************
========================================
【调度进程: aa】 优先级: 6, 还需时间: 7
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 6 | 6 | 2 | 5 | 运行态 |
| bb | 5 | 6 | 0 | 5 | 就绪态 |
| cc | 6 | 6 | 4 | 5 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:5) -> cc(优先级:6)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 5)
>> aa 等待过久,优先级提升为 6
>> bb 等待过久,优先级提升为 6
>> cc 等待过久,优先级提升为 7
******************** 第 7 次调度 ********************
========================================
【调度进程: cc】 优先级: 7, 还需时间: 6
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 6 | 6 | 2 | 6 | 就绪态 |
| bb | 6 | 6 | 0 | 6 | 就绪态 |
| cc | 7 | 5 | 5 | 6 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:6) -> bb(优先级:6)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 6)
>> aa 等待过久,优先级提升为 7
>> bb 等待过久,优先级提升为 7
>> cc 等待过久,优先级提升为 7
******************** 第 8 次调度 ********************
========================================
【调度进程: aa】 优先级: 7, 还需时间: 6
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 7 | 5 | 3 | 7 | 运行态 |
| bb | 7 | 6 | 0 | 7 | 就绪态 |
| cc | 7 | 5 | 5 | 7 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:7) -> cc(优先级:7)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 6)
>> aa 等待过久,优先级提升为 7
>> bb 等待过久,优先级提升为 8
>> cc 等待过久,优先级提升为 8
******************** 第 9 次调度 ********************
========================================
【调度进程: bb】 优先级: 8, 还需时间: 6
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 7 | 5 | 3 | 8 | 就绪态 |
| bb | 8 | 5 | 1 | 8 | 运行态 |
| cc | 8 | 5 | 5 | 8 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:7) -> cc(优先级:8)
>>> 进程 bb 时间片用完,回到就绪队列(优先级降为 7)
>> aa 等待过久,优先级提升为 8
>> bb 等待过久,优先级提升为 8
>> cc 等待过久,优先级提升为 9
******************** 第 10 次调度 ********************
========================================
【调度进程: cc】 优先级: 9, 还需时间: 5
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 8 | 5 | 3 | 9 | 就绪态 |
| bb | 8 | 5 | 1 | 9 | 就绪态 |
| cc | 9 | 4 | 6 | 9 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:8) -> bb(优先级:8)
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 8)
>> aa 等待过久,优先级提升为 9
>> bb 等待过久,优先级提升为 9
>> cc 等待过久,优先级提升为 9
******************** 第 11 次调度 ********************
========================================
【调度进程: aa】 优先级: 9, 还需时间: 5
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 4 | 4 | 10 | 运行态 |
| bb | 9 | 5 | 1 | 10 | 就绪态 |
| cc | 9 | 4 | 6 | 10 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:9) -> cc(优先级:9)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 8)
>> aa 等待过久,优先级提升为 9
>> bb 等待过久,优先级提升为 10
>> cc 等待过久,优先级提升为 10
******************** 第 12 次调度 ********************
========================================
【调度进程: bb】 优先级: 10, 还需时间: 5
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 4 | 4 | 11 | 就绪态 |
| bb | 10 | 4 | 2 | 11 | 运行态 |
| cc | 10 | 4 | 6 | 11 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: aa(优先级:9) -> cc(优先级:10)
>>> 进程 bb 时间片用完,回到就绪队列(优先级降为 9)
>> aa 等待过久,优先级提升为 10
>> bb 等待过久,优先级提升为 10
******************** 第 13 次调度 ********************
========================================
【调度进程: aa】 优先级: 10, 还需时间: 4
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 10 | 3 | 5 | 12 | 运行态 |
| bb | 10 | 4 | 2 | 12 | 就绪态 |
| cc | 10 | 4 | 6 | 12 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:10) -> cc(优先级:10)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 9)
>> aa 等待过久,优先级提升为 10
******************** 第 14 次调度 ********************
========================================
【调度进程: aa】 优先级: 10, 还需时间: 3
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 10 | 2 | 6 | 13 | 运行态 |
| bb | 10 | 4 | 2 | 13 | 就绪态 |
| cc | 10 | 4 | 6 | 13 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:10) -> cc(优先级:10)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 9)
>> aa 等待过久,优先级提升为 10
******************** 第 15 次调度 ********************
========================================
【调度进程: aa】 优先级: 10, 还需时间: 2
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 10 | 1 | 7 | 14 | 运行态 |
| bb | 10 | 4 | 2 | 14 | 就绪态 |
| cc | 10 | 4 | 6 | 14 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:10) -> cc(优先级:10)
>>> 进程 aa 时间片用完,回到就绪队列(优先级降为 9)
>> aa 等待过久,优先级提升为 10
******************** 第 16 次调度 ********************
========================================
【调度进程: aa】 优先级: 10, 还需时间: 1
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 10 | 0 | 8 | 15 | 运行态 |
| bb | 10 | 4 | 2 | 15 | 就绪态 |
| cc | 10 | 4 | 6 | 15 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: bb(优先级:10) -> cc(优先级:10)
>>> 进程 aa 运行完毕!
******************** 第 17 次调度 ********************
========================================
【调度进程: bb】 优先级: 10, 还需时间: 4
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 10 | 3 | 3 | 16 | 运行态 |
| cc | 10 | 4 | 6 | 16 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: cc(优先级:10)
>>> 进程 bb 时间片用完,回到就绪队列(优先级降为 9)
>> bb 等待过久,优先级提升为 10
******************** 第 18 次调度 ********************
========================================
【调度进程: bb】 优先级: 10, 还需时间: 3
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 10 | 2 | 4 | 17 | 运行态 |
| cc | 10 | 4 | 6 | 17 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: cc(优先级:10)
>>> 进程 bb 时间片用完,回到就绪队列(优先级降为 9)
>> bb 等待过久,优先级提升为 10
******************** 第 19 次调度 ********************
========================================
【调度进程: bb】 优先级: 10, 还需时间: 2
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 10 | 1 | 5 | 18 | 运行态 |
| cc | 10 | 4 | 6 | 18 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: cc(优先级:10)
>>> 进程 bb 时间片用完,回到就绪队列(优先级降为 9)
>> bb 等待过久,优先级提升为 10
******************** 第 20 次调度 ********************
========================================
【调度进程: bb】 优先级: 10, 还需时间: 1
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 10 | 0 | 6 | 19 | 运行态 |
| cc | 10 | 4 | 6 | 19 | 就绪态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: cc(优先级:10)
>>> 进程 bb 运行完毕!
******************** 第 21 次调度 ********************
========================================
【调度进程: cc】 优先级: 10, 还需时间: 4
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 9 | 0 | 6 | 19 | 完成态 |
| cc | 10 | 3 | 7 | 20 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: 空
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 9)
>> cc 等待过久,优先级提升为 10
******************** 第 22 次调度 ********************
========================================
【调度进程: cc】 优先级: 10, 还需时间: 3
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 9 | 0 | 6 | 19 | 完成态 |
| cc | 10 | 2 | 8 | 21 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: 空
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 9)
>> cc 等待过久,优先级提升为 10
******************** 第 23 次调度 ********************
========================================
【调度进程: cc】 优先级: 10, 还需时间: 2
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 9 | 0 | 6 | 19 | 完成态 |
| cc | 10 | 1 | 9 | 22 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: 空
>>> 进程 cc 时间片用完,回到就绪队列(优先级降为 9)
>> cc 等待过久,优先级提升为 10
******************** 第 24 次调度 ********************
========================================
【调度进程: cc】 优先级: 10, 还需时间: 1
========================================
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 9 | 0 | 6 | 19 | 完成态 |
| cc | 10 | 0 | 10 | 23 | 运行态 |
----------------------------------------------------------------
【当前就绪队列状态】
就绪队列: 空
>>> 进程 cc 运行完毕!
============================================================
所有进程调度完成!
============================================================
【最终进程状态】
----------------------------------------------------------------
| 进程名 | 优先数 | 需要时间 | 已用时间 | 等待时间 | 状态 |
----------------------------------------------------------------
| aa | 9 | 0 | 8 | 15 | 完成态 |
| bb | 9 | 0 | 6 | 19 | 完成态 |
| cc | 9 | 0 | 10 | 23 | 完成态 |
----------------------------------------------------------------