学习操作系统P4 理解并发程序执行 (Peterson算法、模型检验与软件自动化工具)
啊
多一个线程,在状态机里也可以理解为多一个栈帧
啊
啊
啊
错误如下图所示
啊
啊
当只有一个人想上厕所时,只有一个旗子被举起来,因此举旗的人可以直接进厕所
当两个人都想上厕所时,看门上的名字可以判断谁先抢厕所,先抢厕所的人可以先使用厕所
啊
同时举旗时,手快的人贴的标签会被覆盖掉,从而让自己能够先进厕所
啊
啊
不好解释 Peterson 算法的正确性时,可以尝试枚举并发算法的状态机、或者是把这个算法写出来,用assert和计数器去判断
啊
啊
__sync_synchronize() 既是一个memory barrier(强制TLB flush),也是一个compiler barrier(防止编译器调换指令顺序)
啊
除了用纸和笔话并发程序的状态机以外,还可以使用程序自动画状态机
啊
啊
什么叫 model checker?
一个程序,可以遍历所有可能的、模型上的状态。
这一个150行的程序可以探索并发算法上所有可能的状态,只要状态空间不太大,就能用
啊
python中的关键字:yield
它可以让python代码“返回,但又不完全返回”
啊
使用 yield 关键字,可以很方便地在python中创建 状态机
啊
通过 yield 特性,我们可以创建两个 "线程",每次选一个线程执行一步
啊
model-checker 的原理如图所示
给要检查的算法的每一步语句后面都加上 yield checkpoint()
然后在外面包上一个 runner() 函数,接着探索每一种可能的执行状态
啊
python 中的 insepct 库可以把函数调用栈dump出来,还可以轻松获取程序的局部变量,这就是动态语言的魅力
啊
啊
啊
只要能为系统建立模型,就能用 brute force 证明正确/找到错误
把程序的正确性问题变成了一个图论问题
线程安全问题:critical section 每次最多只有一个线程
啊
liveness: 状态机,从任何状态出发,总能在优先步内到达 蓝色节点或者 绿色节点 (只有一个线程在crtical section 的状态)
livelock: 存在一个黑色节点,可以通过一个环回到自己 (对应情况:所有线程都在运行,但没有线程进入 critical section)
可以通过 强连通分量 解决这个问题
啊
总的来说,并发正确问题就是:红色节点是否可达?是否存在只经过黑色节点、只到自己的环路?
啊
啊
啊
啊
啊