25. 协作式调度
让任务轮流执行,区分策略与 CPU 指令。
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
LOAD 1 CALL taskA CALL taskB HALT taskA: PRINT SLEEP 500 RETURN taskB: LOAD 101 PRINT RETURN
加入输入队列: 无
初始化内存: 所有字节初始为零
试做预测答案
输出: 1, 101
| 指令 | 执行前 PC | 执行后 PC | 执行前 R0 | 执行后 R0 | 相关状态 | 输出 |
|---|---|---|---|---|---|---|
| LOAD | 0 | 1 | 0 | 1 | {"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]} | 无 |
| CALL | 1 | 4 | 1 | 1 | {"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":254,"stack":[],"callStack":[2],"loopStack":[],"memoryReads":[],"memoryWrites":[]} | 无 |
| 4 | 5 | 1 | 1 | {"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":254,"stack":[],"callStack":[2],"loopStack":[],"memoryReads":[],"memoryWrites":[]} | 1 |
2. 构建与检查
读取 0 到 3 的轮数。任务 A 计数器从 0 开始,任务 B 从 100 开始。每轮先调用 A,让它递增并输出自己的计数器,再调用 B 完成相同操作。
必需的指令类型: INPUT, LOOP, CALL, RETURN
挑战示例答案
INPUT COPY R0 R3 LOAD 0 R1 LOAD 100 R2 LOOP R3 CALL taskA CALL taskB RETURN HALT taskA: LOAD R1 ADD 1 COPY R0 R1 PRINT SLEEP 0 RETURN taskB: LOAD R2 ADD 1 COPY R0 R2 PRINT SLEEP 0 RETURN
实际检查器测试数据
案例 1
- 输入
0- 初始内存
所有字节初始为零- 预期输出
无
案例 2
- 输入
1- 初始内存
所有字节初始为零- 预期输出
1, 101
案例 3
- 输入
3- 初始内存
所有字节初始为零- 预期输出
1, 101, 2, 102, 3, 103
3. 解释机器
CALL/RETURN 轮流执行与硬件抢占相同吗?
推理与教学说明
不同。这是协作分派器模型;实际调度策略与时间片属于明确标注的系统模拟。