教师参考答案

调度、核心与事件

收集四类证据:相关状态的预测;多种案例(包括边界)的行为;依据轨迹和状态的解释;对一次不一致作出有理由的修正。使用纸面或学校现有批准流程,将各项记录为初步、需支持或独立完成。挑战通过证明的是机器行为,不证明作者身份或完全掌握。接受等效正确程序;公开答案是示范,并非唯一答案。

公开教学材料。答案是示例;等效的正确程序也可能通过实际检查。

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相关状态输出
LOAD0101{"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}无
CALL1411{"registers":[1,0,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":254,"stack":[],"callStack":[2],"loopStack":[],"memoryReads":[],"memoryWrites":[]}无
PRINT4511{"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 轮流执行与硬件抢占相同吗?

推理与教学说明

不同。这是协作分派器模型;实际调度策略与时间片属于明确标注的系统模拟。