25. 协作式调度
让任务轮流执行,区分策略与 CPU 指令。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
LOAD 1
CALL taskA
CALL taskB
HALT
taskA: PRINT
SLEEP 500
RETURN
taskB: LOAD 101
PRINT
RETURN
加入输入队列: 无
初始化内存: 所有字节初始为零
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:
#
RETURN
taskB:
#
RETURN
你的程序与笔记
3. 解释机器
CALL/RETURN 轮流执行与硬件抢占相同吗?
26. 跨核心划分工作
拆分独立作业,并合并结果。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
STORE 1 0
STORE 2 1
STORE 3 2
STORE 4 3
LOAD [0]
MUL R0
COPY R0 R1
LOAD [2]
MUL R0
ADD R1
PRINT
HALT
加入输入队列: 无
初始化内存: 0: 1, 1: 2, 2: 3, 3: 4
2. 构建与检查
内存 0–3 已预设四个作业值。偶数任务计算 value[0]² + value[2]²,奇数任务计算 value[1]² + value[3]²。调用两个任务,依次输出偶数总和、奇数总和及合计。
必需的指令类型: CALL, MUL, LOAD, ADD
起始程序
CALL evenWorker
PRINT
CALL oddWorker
PRINT
LOAD R1
ADD R2
PRINT
HALT
evenWorker:
#
RETURN
oddWorker:
#
RETURN
你的程序与笔记
3. 解释机器
顺序计算两个任务总和能证明并行执行吗?
27. 中断与处理程序
处理事件,再恢复被中断的前台数值。
打开本课 →
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
STORE 4 240
LOAD 17
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler: PUSH
LOAD [240]
ADD 1
STORE 241
POP
RETURN
加入输入队列: 无
初始化内存: 所有字节初始为零
2. 构建与检查
读取一个前台整数,再读取一个事件字节。把事件保存在地址 240。调用处理程序,用 PUSH/POP 保留前台 R0,同时把事件 + 1 写入字节内存 241。先输出恢复的前台值,再输出保存的事件结果。
必需的指令类型: INPUT, PUSH, POP, CALL, STORE
起始程序
INPUT
COPY R0 R1
INPUT
STORE 240
LOAD R1
CALL handler
PRINT
LOAD [241]
PRINT
HALT
handler:
#
RETURN
你的程序与笔记
3. 解释机器
前台恢复前,处理程序必须恢复什么?