# CPU 时间片轮转模拟器——课堂演示需求说明

## 1. 目标与范围

开发一个浏览器中运行的交互式教学网页，帮助学生理解时间片轮转调度（Round Robin，RR）。

用户能够逐步观察 CPU 执行、进程剩余运行时间和就绪队列的变化。

第一版模拟单 CPU，各进程只有一段计算任务，不涉及 I/O 阻塞、优先级、多核和进程切换开销。无需登录或联网，浏览器打开即可使用。

## 2. 输入与默认例题

每个进程包含：唯一名称、到达时间、所需运行时间。

到达时间必须为非负整数；所需运行时间和时间片长度必须为正整数。名称不能为空或重复。无进程或输入不合法时，应提示原因并阻止运行。

默认时间片为 1，使用课件中的例题：

| 进程 | 到达时间 | 所需运行时间 |
| --- | ---: | ---: |
| A | 0 | 3 |
| B | 2 | 6 |
| C | 4 | 4 |
| D | 6 | 5 |
| E | 8 | 2 |

用户可以修改进程参数和时间片。运行期间参数只读，重置后允许修改并重新模拟。

## 3. 调度规则

- REQ-01：就绪队列采用先进先出顺序。CPU 空闲时，选择队首进程运行。
- REQ-02：每经过一个模拟时间单位，运行进程的剩余运行时间减少 1，已使用时间片增加 1。
- REQ-03：进程完成后立即退出调度，不再进入就绪队列。
- REQ-04：进程时间片用完且尚未完成时，返回就绪队列末尾。
- REQ-05：新进程到达不会立即抢占尚未用完时间片的运行进程。
- REQ-06：同一时刻发生多个事件时，先处理上一单位运行的完成结果，再将新到达进程追加到队尾，随后将时间片用完但未完成的进程追加到队尾，最后在 CPU 空闲时选择队首进程。
- REQ-07：多个进程同时到达时，按输入表中的先后顺序入队。队列中原有进程的相对顺序保持不变。
- REQ-08：没有可运行进程但还有进程尚未到达时，CPU 显示“空闲”，模拟时间继续推进。
- REQ-09：全部进程完成后停止模拟，提示“全部完成”。

## 4. 界面与操作

界面包含：

- 进程参数表和时间片设置。
- 当前模拟时刻、CPU 当前运行进程。
- 从队首到队尾排列的就绪队列。
- 各进程的剩余运行时间和状态：未到达、就绪、运行、完成。
- 已执行的时间轴，使用不同颜色区分进程，并标明进程名称。

初始时刻为 0，先处理此时到达的进程并选择运行进程。时刻 t 的 CPU 面板显示调度后准备运行的进程，时间轴只显示已经执行完的区间。

提供四个操作：

- “下一步”：推进一个模拟时间单位，完成运行计算和该时刻的调度，再同步更新所有显示。
- “自动播放”：按固定间隔重复执行“下一步”。
- “暂停”：停止自动推进，保留当前状态。
- “重置”：停止播放，清空执行历史，恢复初始状态，保留当前参数。

自动播放的快慢只影响展示速度，不得改变调度结果。播放期间禁用“下一步”，重复点击播放不得产生多个计时器。

## 5. 展示要求

适合课堂投影，主要文字和操作按钮字号建议不小于 20px。进程身份同时使用名称和颜色表示，不能只靠颜色区分。

同一时刻的 CPU、队列、剩余时间和时间轴必须一致。

## 6. 验收标准

| 场景 | 输入 | 预期结果 |
| --- | --- | --- |
| 课件例题 | 默认 A–E，时间片为 1 | 每单位执行顺序为：A A B A B C B D C B E D C B E D C B D D；时刻 20 全部完成 |
| 同时到达与时间片结束 | A：到达 0、运行 2；B：到达 1、运行 1；时间片为 1 | 执行顺序为 A B A，验证新到达进程先于回队进程入队 |
| 到达不立即抢占 | A：到达 0、运行 3；B：到达 1、运行 1；时间片为 2 | 每单位执行顺序为 A A B A |
| CPU 空闲 | 只有 A：到达 2、运行 1 | 前两个时间单位空闲，A 在区间 [2,3) 运行，时刻 3 完成 |
| 单步与播放一致 | 同一组输入分别单步运行和自动播放 | 执行时间轴和最终结果完全一致 |
| 重置 | 运行若干步后点击重置 | 时刻恢复为 0，历史清空，剩余运行时间恢复初始值 |

## 7. 需求补充：队列动画与 CPU 关系说明（2026-10-26）

### 7.1 概念说明

CPU 中的当前进程已经从就绪队列的队首取出；就绪队列只包含正在等待 CPU 的进程。因此，正常调度完成后的界面中，同一个进程不会同时出现在 CPU 和就绪队列里。

时间片用完且进程尚未完成时，它离开 CPU，重新加入队尾；如果进程已完成，则退出调度，不再回队。

### 7.2 动画要求

- ANIM-01：将原先容易产生歧义的“将执行”改为“CPU · 运行 [t,t+1)”，并说明队首进程进入 CPU 时会离开队列。
- ANIM-02：每个模拟时间单位执行完后，按真实顺序逐项展示边界事件；如果当前进程完成，先从 CPU 移入“已完成”区域；然后新到达进程从上方的新进程区域移动到队尾，未完成且时间片耗尽的进程随后从 CPU 移动到队尾，最后将队首进程移动到 CPU。
- ANIM-03：卡片移动时保留对应的进程名称和颜色，标记队首、队尾，并用文字说明当前是运行完成、新到达、轮转回队还是进入 CPU。队列中原有进程的相对顺序保持不变。
- ANIM-04：动画中的临时界面明确标为“边界调度中”。动画只分解展示一个时刻的事件，不增加模拟时间，不计作 CPU 切换耗时。
- ANIM-05：新到达进程不能通过动画抢占尚未用完时间片的进程；已完成进程不得出现回队动画。
- ANIM-06：动画期间禁止再次单步或重复开始播放。自动播放必须等本步动画结束后，再等待所选播放间隔并推进下一步，避免多个步骤同时发生。
- ANIM-07：点击暂停后不再推进新的模拟时间单位；如果当前一步正在播放动画，则完成本步动画后停住，随后允许继续单步或播放。
- ANIM-08：点击重置应立即取消当前动画和后续播放，清除移动卡片与路径；过期动画不得覆盖重置后的状态。
- ANIM-09：页面初次打开、修改初始参数时立即展示初始状态，不自动播放入队动画。系统启用“减少动态效果”时跳过位移动画，调度结果保持一致。
- ANIM-10：新进程区域位于 CPU、就绪队列的上方，显示尚未到达的进程及到达时刻。到达时先通过亮起、放大的动画突出该进程，再从上方向下移动到队尾；不将新进程区域放在就绪队列内部。
- ANIM-11：已完成区域与新进程区域并列放在上方。进程完成时，从 CPU 飞入已完成区域，显示完成标记和完成时刻，并在后续步骤中保留。最后一个进程的退出动画完成后，才显示“全部完成”并停止播放。
- ANIM-12：CPU 中的进程卡片与就绪队列使用一致的实色背景、白色文字、圆角和字号，仅显示进程名称及剩余运行时间。移除卡片中的“时间片尚余”一行；时间片参数仍在页面顶部及设置区显示，并按原调度规则生效。

### 7.3 补充验收

| 场景 | 输入或操作 | 预期结果 |
| --- | --- | --- |
| 同刻入队的完整动画 | A `(到达 0，运行 2)`、B `(到达 1，运行 1)`，q=1，执行一步 | t=1 先看到 B 入队，队列为 `[B]`；再看到 A 从 CPU 回队，队列为 `[B,A]`；最后 B 从队首进入 CPU，队列只剩 `[A]` |
| 完成优先于回队 | A `(0,1)`、B `(1,1)`，q=1，执行一步 | A 先从 CPU 飞入已完成区域，再播放 B 入队和 B 进入 CPU 的动画；没有 A 回队动画 |
| 动画中重置 | 移动卡片出现时点击重置 | 立即恢复 t=0，清除动画和执行历史；等待后也不会自行跳回旧状态 |
| 动画中暂停 | 自动播放出现入队动画时点击暂停 | 当前一步完成后停住；模拟时间不再增加，可以继续单步或播放 |
| 减少动态效果 | 启用系统“减少动态效果”后运行课件例题 | 跳过卡片飞行动画，仍按原需求在 t=20 完成 |
| 上方新进程动画 | 观察默认例题 t=2 的 B | B 在上方亮起、放大，再飞向就绪队列的队尾；上方区域始终位于 CPU 和队列之上 |
| 最后一个进程完成 | 仅 A `(0,1)`，q=1，执行一步 | A 从 CPU 飞向已完成区域，动画结束后显示全部完成；完成卡片标注 t=1 |
| 完成动画中重置 | 完成卡片移动时点击重置 | 立即回到 t=0，清空已完成区域，旧动画不得再次写入完成卡片或改变状态 |
