进程 + 线程 + 终端 + 存储 (崩溃一致性)
系统调用/Linux 对应 | 行为 |
---|---|
sys_spawn(fn)/pthread_create | 创建从 fn 开始执行的线程 |
sys_fork()/fork | 创建当前状态机的完整复制 |
sys_sched()/定时被动调用 | 切换到随机的线程/进程执行 |
sys_choose(xs)/rand | 返回一个 xs 中的随机的选择 |
sys_write(s)/printf | 向调试终端输出字符串 s |
sys_bread(k)/read | 读取虚拟设磁盘块 $k$ 的数据 |
sys_bwrite(k, v)/write | 向虚拟磁盘块 $k$ 写入数据 $v$ |
sys_sync()/sync | 将所有向虚拟磁盘的数据写入落盘 |
sys_crash()/长按电源按键 | 模拟系统崩溃 |
被动进程/线程切换
sys_sched()
切换只有一个终端
read()
(用 choose 替代 “允许读到任意值”)磁盘是一个 dict
原理与刚才的 “最小操作系统玩具” 类似
输出程序运行的 “状态图”
我们可以把状态机的执行
这对于更复杂的程序来说是十分关键的
void Tsum() {
for (int i = 0; i < n; i++) {
int tmp = sum;
tmp++;
// 假设此时可能发生进程/线程切换
sum = tmp;
}
}