操作系统课程设计C语言实现进程调度模拟器含5进程测试用例在操作系统课程设计中进程调度算法的实现是一个经典且极具实践价值的课题。本文将带领读者从零构建一个完整的进程调度模拟器项目涵盖FCFS先来先服务、SJF短作业优先和RR时间片轮转三种核心调度算法。不同于简单的代码片段演示本项目采用模块化设计包含完整的Makefile构建系统、详细的PCB结构设计以及可直接用于课程报告的5个预设测试用例。1. 项目架构设计一个完整的进程调度模拟器需要包含以下核心模块. ├── Makefile # 构建配置文件 ├── include/ # 头文件目录 │ ├── pcb.h # 进程控制块定义 │ └── scheduler.h # 调度算法声明 ├── src/ # 源代码目录 │ ├── main.c # 主程序入口 │ ├── pcb.c # PCB操作实现 │ └── scheduler.c # 调度算法实现 ├── test/ # 测试用例 │ └── test_case_1.txt # 预设进程参数 └── docs/ # 文档 └── report_template.md # 课程报告模板关键数据结构设计// pcb.h typedef enum { READY, RUNNING, BLOCKED } ProcessState; typedef struct PCB { char name[20]; // 进程标识符 int pid; // 进程ID int arrival_time; // 到达时间毫秒 int burst_time; // 总服务时间 int remaining_time; // 剩余服务时间 int start_time; // 首次执行时间 int finish_time; // 完成时间 ProcessState state; // 当前状态 struct PCB *next; // 队列指针 } PCB;2. 核心算法实现2.1 FCFS调度算法实现先来先服务是最简单的调度策略其核心逻辑可分解为队列排序按到达时间升序排列时间线推进依次执行每个进程直至完成// scheduler.c void FCFS(PCB *processes, int count) { Queue *ready_queue create_queue(); // 按到达时间排序 sort_by_arrival(processes, count); int current_time 0; for (int i 0; i count; i) { PCB *p processes[i]; // 处理空闲时间间隔 if (current_time p-arrival_time) { current_time p-arrival_time; } p-start_time current_time; p-finish_time current_time p-burst_time; current_time p-finish_time; // 输出执行过程 printf([%d-%d] %s (PID: %d) executing\n, p-start_time, p-finish_time, p-name, p-pid); } calculate_metrics(processes, count); }性能指标计算指标计算公式优化目标周转时间完成时间 - 到达时间最小化带权周转时间周转时间 / 服务时间最小化平均等待时间Σ(开始时间 - 到达时间)/N最小化2.2 SJF调度算法优化短作业优先算法需要动态选择当前最短的进程void SJF(PCB *processes, int count) { MinHeap *heap create_min_heap(count); int current_time 0, completed 0; while (completed count) { // 将已到达进程加入堆 for (int i 0; i count; i) { if (processes[i].arrival_time current_time processes[i].remaining_time 0) { min_heap_insert(heap, processes[i]); } } if (heap-size 0) { current_time; continue; } PCB *p heap_extract_min(heap); p-start_time current_time; p-finish_time current_time p-burst_time; current_time p-finish_time; p-remaining_time 0; completed; printf([%d-%d] %s executed (Remaining: %d)\n, p-start_time, p-finish_time, p-name, p-remaining_time); } free_min_heap(heap); }关键优化点使用最小堆优先队列实现O(log n)的插入和提取操作动态更新剩余服务时间处理CPU空闲时段2.3 RR算法时间片处理时间片轮转需要特殊的时间分片管理void RR(PCB *processes, int count, int time_quantum) { Queue *ready_queue create_queue(); int current_time 0, completed 0; while (completed count) { // 新进程到达处理 for (int i 0; i count; i) { if (processes[i].arrival_time current_time) { enqueue(ready_queue, processes[i]); } } if (!is_empty(ready_queue)) { PCB *p dequeue(ready_queue); int execute_time min(time_quantum, p-remaining_time); p-remaining_time - execute_time; printf([%d-%d] %s executed %d ms (Remaining: %d)\n, current_time, current_time execute_time, p-name, execute_time, p-remaining_time); current_time execute_time; // 未完成则重新入队 if (p-remaining_time 0) { enqueue(ready_queue, p); } else { p-finish_time current_time; completed; } } else { current_time; } } }3. 测试用例设计提供5个标准测试场景验证算法正确性测试用例1- 基础场景P1 0 24 P2 1 3 P3 2 3测试用例2- 长作业优先P1 0 6 P2 0 8 P3 0 7 P4 0 3测试用例3- 突发进程到达P1 0 10 P2 5 1 P3 5 2 P4 10 6 P5 15 4执行结果对比示例算法平均周转时间平均带权周转时间FCFS34.2 ms4.56SJF22.8 ms2.17RR(4)28.6 ms3.424. 工程化扩展Makefile配置示例CC gcc CFLAGS -Wall -I./include BIN scheduler SRC $(wildcard src/*.c) OBJ $(SRC:.c.o) all: $(BIN) $(BIN): $(OBJ) $(CC) $(CFLAGS) $^ -o $ %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJ) $(BIN)交互式菜单实现void show_menu() { printf(\n Process Scheduler Simulator \n); printf(1. FCFS Scheduling\n); printf(2. SJF Scheduling\n); printf(3. RR Scheduling\n); printf(4. Load Test Case\n); printf(5. Exit\n); printf(\n); } int main() { PCB processes[MAX_PROCESS]; int count 0; while (1) { show_menu(); int choice get_user_choice(); switch (choice) { case 1: FCFS(processes, count); break; case 2: SJF(processes, count); break; case 3: printf(Enter time quantum: ); int tq read_int(); RR(processes, count, tq); break; case 4: count load_test_case(test/test_case_1.txt, processes); break; case 5: return 0; } } }5. 可视化输出为增强演示效果可添加ASCII图表输出FCFS 执行时序图: [0-----24] P1 ######################## [24----27] P2 ### [27----30] P3 ### SJF 执行时序图: [0-----3] P2 ### [3-----6] P3 ### [6----30] P1 ########################通过本项目的完整实现学生不仅可以深入理解调度算法原理还能掌握以下实践技能模块化的C程序设计数据结构在系统编程中的应用性能指标分析与比较方法工程化项目的组织方式
操作系统课程设计:C语言实现进程调度模拟器(含5进程测试用例)
发布时间:2026/7/10 2:50:09
操作系统课程设计C语言实现进程调度模拟器含5进程测试用例在操作系统课程设计中进程调度算法的实现是一个经典且极具实践价值的课题。本文将带领读者从零构建一个完整的进程调度模拟器项目涵盖FCFS先来先服务、SJF短作业优先和RR时间片轮转三种核心调度算法。不同于简单的代码片段演示本项目采用模块化设计包含完整的Makefile构建系统、详细的PCB结构设计以及可直接用于课程报告的5个预设测试用例。1. 项目架构设计一个完整的进程调度模拟器需要包含以下核心模块. ├── Makefile # 构建配置文件 ├── include/ # 头文件目录 │ ├── pcb.h # 进程控制块定义 │ └── scheduler.h # 调度算法声明 ├── src/ # 源代码目录 │ ├── main.c # 主程序入口 │ ├── pcb.c # PCB操作实现 │ └── scheduler.c # 调度算法实现 ├── test/ # 测试用例 │ └── test_case_1.txt # 预设进程参数 └── docs/ # 文档 └── report_template.md # 课程报告模板关键数据结构设计// pcb.h typedef enum { READY, RUNNING, BLOCKED } ProcessState; typedef struct PCB { char name[20]; // 进程标识符 int pid; // 进程ID int arrival_time; // 到达时间毫秒 int burst_time; // 总服务时间 int remaining_time; // 剩余服务时间 int start_time; // 首次执行时间 int finish_time; // 完成时间 ProcessState state; // 当前状态 struct PCB *next; // 队列指针 } PCB;2. 核心算法实现2.1 FCFS调度算法实现先来先服务是最简单的调度策略其核心逻辑可分解为队列排序按到达时间升序排列时间线推进依次执行每个进程直至完成// scheduler.c void FCFS(PCB *processes, int count) { Queue *ready_queue create_queue(); // 按到达时间排序 sort_by_arrival(processes, count); int current_time 0; for (int i 0; i count; i) { PCB *p processes[i]; // 处理空闲时间间隔 if (current_time p-arrival_time) { current_time p-arrival_time; } p-start_time current_time; p-finish_time current_time p-burst_time; current_time p-finish_time; // 输出执行过程 printf([%d-%d] %s (PID: %d) executing\n, p-start_time, p-finish_time, p-name, p-pid); } calculate_metrics(processes, count); }性能指标计算指标计算公式优化目标周转时间完成时间 - 到达时间最小化带权周转时间周转时间 / 服务时间最小化平均等待时间Σ(开始时间 - 到达时间)/N最小化2.2 SJF调度算法优化短作业优先算法需要动态选择当前最短的进程void SJF(PCB *processes, int count) { MinHeap *heap create_min_heap(count); int current_time 0, completed 0; while (completed count) { // 将已到达进程加入堆 for (int i 0; i count; i) { if (processes[i].arrival_time current_time processes[i].remaining_time 0) { min_heap_insert(heap, processes[i]); } } if (heap-size 0) { current_time; continue; } PCB *p heap_extract_min(heap); p-start_time current_time; p-finish_time current_time p-burst_time; current_time p-finish_time; p-remaining_time 0; completed; printf([%d-%d] %s executed (Remaining: %d)\n, p-start_time, p-finish_time, p-name, p-remaining_time); } free_min_heap(heap); }关键优化点使用最小堆优先队列实现O(log n)的插入和提取操作动态更新剩余服务时间处理CPU空闲时段2.3 RR算法时间片处理时间片轮转需要特殊的时间分片管理void RR(PCB *processes, int count, int time_quantum) { Queue *ready_queue create_queue(); int current_time 0, completed 0; while (completed count) { // 新进程到达处理 for (int i 0; i count; i) { if (processes[i].arrival_time current_time) { enqueue(ready_queue, processes[i]); } } if (!is_empty(ready_queue)) { PCB *p dequeue(ready_queue); int execute_time min(time_quantum, p-remaining_time); p-remaining_time - execute_time; printf([%d-%d] %s executed %d ms (Remaining: %d)\n, current_time, current_time execute_time, p-name, execute_time, p-remaining_time); current_time execute_time; // 未完成则重新入队 if (p-remaining_time 0) { enqueue(ready_queue, p); } else { p-finish_time current_time; completed; } } else { current_time; } } }3. 测试用例设计提供5个标准测试场景验证算法正确性测试用例1- 基础场景P1 0 24 P2 1 3 P3 2 3测试用例2- 长作业优先P1 0 6 P2 0 8 P3 0 7 P4 0 3测试用例3- 突发进程到达P1 0 10 P2 5 1 P3 5 2 P4 10 6 P5 15 4执行结果对比示例算法平均周转时间平均带权周转时间FCFS34.2 ms4.56SJF22.8 ms2.17RR(4)28.6 ms3.424. 工程化扩展Makefile配置示例CC gcc CFLAGS -Wall -I./include BIN scheduler SRC $(wildcard src/*.c) OBJ $(SRC:.c.o) all: $(BIN) $(BIN): $(OBJ) $(CC) $(CFLAGS) $^ -o $ %.o: %.c $(CC) $(CFLAGS) -c $ -o $ clean: rm -f $(OBJ) $(BIN)交互式菜单实现void show_menu() { printf(\n Process Scheduler Simulator \n); printf(1. FCFS Scheduling\n); printf(2. SJF Scheduling\n); printf(3. RR Scheduling\n); printf(4. Load Test Case\n); printf(5. Exit\n); printf(\n); } int main() { PCB processes[MAX_PROCESS]; int count 0; while (1) { show_menu(); int choice get_user_choice(); switch (choice) { case 1: FCFS(processes, count); break; case 2: SJF(processes, count); break; case 3: printf(Enter time quantum: ); int tq read_int(); RR(processes, count, tq); break; case 4: count load_test_case(test/test_case_1.txt, processes); break; case 5: return 0; } } }5. 可视化输出为增强演示效果可添加ASCII图表输出FCFS 执行时序图: [0-----24] P1 ######################## [24----27] P2 ### [27----30] P3 ### SJF 执行时序图: [0-----3] P2 ### [3-----6] P3 ### [6----30] P1 ########################通过本项目的完整实现学生不仅可以深入理解调度算法原理还能掌握以下实践技能模块化的C程序设计数据结构在系统编程中的应用性能指标分析与比较方法工程化项目的组织方式