学习操作系统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)

可以通过 强连通分量 解决这个问题

总的来说,并发正确问题就是:红色节点是否可达?是否存在只经过黑色节点、只到自己的环路?

 

 

 

posted @ 2023-03-02 20:38  yinhuachen  阅读(76)  评论(0编辑  收藏  举报