# cpu-scheduling-visualization **Repository Path**: liyihan11/cpu-scheduling-visualization ## Basic Information - **Project Name**: cpu-scheduling-visualization - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-14 - **Last Updated**: 2026-06-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # CPU 进程调度模拟系统 ## 概述 本项目模拟实现了操作系统课程要求的两种进程调度算法:**基于优先级的轮转调度**(Priority Round Robin)和**多级反馈队列调度**(Multi-level Feedback Queue, MFQ)及其动画演示。 技术栈:React 18 + Vite + TypeScript + Tailwind CSS 4 + Framer Motion ## 算法说明 ### 优先级轮转调度 - 每个进程拥有静态优先级(1~100,数值越小优先级越高) - 调度时选择优先级最高(数值最小)的就绪进程 - 时间片耗尽后,进程优先级数值 +3(优先级下降),重新参与调度 - 支持抢占:若有更高优先级进程到达,立即剥夺当前进程执行权 - 调度顺序:优先级优先,优先级相同时按到达时间排序 ### 多级反馈队列调度 - 3 个队列层级:Q0(最高)、Q1、Q2(最低) - 时间片配置:Q0=2, Q1=4, Q2=6(基础时间片乘以队列等级) - 新进程初始进入 Q0,执行完一个时间片后若未完成则降级至下一队列 - 调度顺序:优先处理高优先级队列;同一队列内按 FIFO 执行 - 高优先级队列非空时,低优先级队列中的运行进程会被抢占 ## 默认测试数据 | 进程 | 到达时间 | 运行时间 | 优先级 | |------|---------|---------|--------| | P1 | 0 | 5 | 15 | | P2 | 1 | 3 | 20 | | P3 | 2 | 6 | 10 | | P4 | 3 | 10 | 25 | 默认时间片(RR)= 2 ## 界面功能 - **执行甘特图**:实时显示各进程执行时间段,支持时间窗口滚动,当前时刻标有 NOW 指示线 - **进程统计信息**:展示所有进程 ID、到达时间、运行时间、剩余时间、优先级、状态(等待/就绪/执行/完成)、周转时间 - **就绪队列**:可视化显示各就绪进程;MFQ 模式下分 Q0/Q1/Q2 三层展示,带当前调度队列高亮指示 - **控制面板**:切换调度算法、调节模拟速度、调节时间片、启停自动执行、单步执行、动态添加进程、重置 ## 快捷键 | 快捷键 | 功能 | |--------|------| | Ctrl+P | 启动/暂停自动执行 | | Ctrl+右箭头 | 单步执行 | ## 项目结构 ``` src/ ├── components/ # UI 组件目录 │ ├── ControlPanel.tsx # 控制面板:算法切换、速度/时间片调节、启停控制 │ ├── GanttChart.tsx # 甘特图:进程执行时间段可视化 │ ├── Header.tsx # 顶部栏:当前时间、已完成数、平均周转时间 │ ├── ProcessTable.tsx # 进程表:各进程详细信息与状态 │ └── ReadyQueue.tsx # 就绪队列:MFQ 分层或优先级排序展示 ├── hooks/ # React Hooks 目录 │ └── useScheduler.ts # 调度器核心逻辑 reducer ├── types/ # TypeScript 类型定义目录 │ └── index.ts # PCB、GanttEntry、Algorithm 等类型 ├── App.tsx # 主应用组件 └── main.tsx # 入口文件 ``` ## TICK 执行周期 每个时间单位(tick)内调度器按以下顺序执行: 1. **进程到达**:将到达时刻等于当前时刻且状态为 waiting 的进程置为 ready,进入就绪队列 2. **状态维护**:检查正在运行的进程——若运行时间耗尽则标记为 finished;若时间片耗尽则降级(优先级算法加优先级,MFQ 降队列等级)并置 runningIdx = -1 3. **抢占检查**:若 CPU 仍在运行,检查是否有更高优先级进程(优先级算法)或更高层队列有进程等待(MFQ);若有则剥夺当前进程 4. **调度**:若 CPU 空闲,按算法规则选择下一个进程投入运行 5. **执行**:选中的进程运行 1 个时间单位,更新 remainTime、cpuTime、sliceRemaining,并记录甘特图 ## 关键实现细节 - 使用 `useReducer` 管理调度状态,所有状态变更通过纯函数 `schedulerReducer` 完成 - PCB 的 `sliceRemaining` 字段独立追踪每个进程在当前时间片的剩余时间,支持 MFQ 下同一队列内不同进程的时间片隔离 - 甘特图记录格式为 `[startTime, duration)`,合并相邻同进程块避免碎片化 - MFQ 降级时使用 `unshift` 将被降级进程重新放回当前队列头部,保证降级进程不会立即被同队列新进程抢先 ## 运行 ```bash npm install npm run dev ``` 构建生产版本:`npm run build`