程序 = 状态机
学会更有效地使用 “程序 = 状态机” 这个理解
学习 “程序 = 状态机” 在计算机科学中的应用
Tower of Hanoi (hanoi.c)
Peterson 算法
Safety:
Liveness:
Fairness: ...
Wow!
Quite trivial
“程序 = 状态机 = 有向图” 是计算机科学最的基础工具之一。
我们的物理世界是 deterministic 的状态机吗?
把物理世界建模成基本粒子的运动
可以在这个模型上严肃地定义很多概念:预测未来、时间旅行……
例子
计算机硬件的 Simple Sequential Execution (SSE)
# printf("%d + %d = %d\n", a, b, a + b);
lea (%rdi,%rsi,1),%ecx
mov %esi,%edx
xor %eax,%eax
mov %edi,%esi
lea 0xe70(%rip),%rdi # stdout
jmpq 1050 <printf@plt>
超标量 (superscalar) 处理器
程序执行 = 状态机执行
程序执行是随时间 “前进” 的 $ s_0 \to s_1 \to s_2 \to \ldots $
记录所有 $s_i$ 的开销太大 ($s_i$ 由内存 + 寄存器组成)
gdb 的隐藏功能 (大家读过 gdb 的手册了吗?)
record full
- 开始记录record stop
- 结束记录reverse-step
/reverse-stepi
- “时间旅行调试”例子:调试 rdrand.c
在程序执行时记录信息,结束后重现程序的行为
Record & Replay: 只需记录 non-deterministic 的指令的
-icount shift=auto,rr=record,rrfile=replay.bin
)void f(int x, int y) {
int z = x * y;
if (z == 18) {
bug();
}
}
int main() {
int x = nondet(), y = x * 2;
f(x, y);
}
执行一次程序,可以得到一条路径
本次课内容与目标
Take-away messages