理解并发程序执行 (Peterson算法、模型检验与软件自动化工具
本次课回答的问题
- Q: 如何理解各种并发程序?
Take-away message
- 并发程序 = 状态机
- 线程共享内存
- 每一步非确定选择线程执行
- 画状态机就对了
- 当然,用工具帮你画 (model checker)
画状态机
初始状态
pc1 pc2 x y turn
(1 1 0 0 A)
T1执行
会abort
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include "thread.h" #define A 1 #define B 2 atomic_int nested; atomic_long count; void critical_section() { long cnt = atomic_fetch_add(&count, 1); assert (atomic_fetch_add(&nested, 1) == 0); atomic_fetch_add(&nested, -1); } int volatile x = 0, y = 0, turn = A; void TA() { while (1) { /* PC=1 */ x = 1; /* PC=2 */ turn = B; /* PC=3 */ while (y && turn == B) ; critical_section(); /* PC=4 */ x = 0; } } void TB() { while (1) { /* PC=1 */ y = 1; /* PC=2 */ turn = A; /* PC=3 */ while (x && turn == A) ; critical_section(); /* PC=4 */ y = 0; } } int main() { create(TA); create(TB); } |
习题:证明 Peterson 算法正确,或给出反例
进入临界区的情况
如果只有一个人举旗,他就可以直接进入
如果两个人同时举旗,由厕所门上的标签决定谁进
手快有(被另一个人的标签覆盖)、手慢无
一些具体的细节情况
A 看到 B 没有举旗
B 一定不在临界区
或者 B 想进但还没来得及把 “A 正在使用” 贴在门上
memory ordering
A 看到 B 举旗子
A 一定已经把旗子举起来了
https://jyywiki.cn/OS/2022/slides/4.slides#/1/3
Peterson 算法
正确性不明的奇怪尝试 (Peterson 算法)
A 和 B 争用厕所的包厢
- 想进入包厢之前,A/B 都要先举起自己的旗子
- A 确认旗子举好以后,往厕所门上贴上 “B 正在使用” 的标签
- B 确认旗子举好以后,往厕所门上贴上 “A 正在使用” 的标签
- 然后,如果对方的旗子举起来,且门上的名字不是自己,等待
- 否则可以进入包厢
- 出包厢后,放下自己的旗子
- 处理器默认不保证 load + store 的原子性
失败的尝试
int locked = UNLOCK;
void critical_section() {
retry:
if (locked != UNLOCK) {
goto retry;
}
locked = LOCK;
// critical section
locked = UNLOCK;
}
和山寨 alipay.c 完全一样的错误
【理解并发程序执行 (Peterson算法、模型检验与软件自动化工具) [南京大学2022操作系统-P4]】https://www.bilibili.com/video/BV15T4y1Q76V
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2018-09-14 扩容数据盘_Linux
2018-09-14 /etc/fstab
2018-09-14 磁道的容量 计算
2018-09-14 把系统盘数据放在磁盘最外圈的原因
2018-09-14 机械硬盘 HDD 固态硬盘 SSD
2018-09-14 通过通道进行通信的方式保证了同步性
2018-09-14 不要通过共享内存来通信,而通过通信来共享内存。