【NJU OS】08 并发 Bug 和应对

应对Bug的方法

基本思路:否定你自己

虽然不太愿意承认,但始终假设自己的代码是错的。

Bug 多的根本原因:编程语言的缺陷

软件是需求 (规约) 在计算机数字世界的投影。

更实在的方法:防御性编程

把程序需要满足的条件用 assert 表达出来。

并发 Bug:死锁 (Deadlock)

AA-Deadlock

ABBA-Deadlock

避免死锁

死锁产生的四个必要条件 (Edward G. Coffman, 1971):

  • 互斥:一个资源每次只能被一个进程使用
  • 请求与保持:一个进程请求资阻塞时,不释放已获得的资源
  • 不剥夺:进程已获得的资源不能强行剥夺
  • 循环等待:若干进程之间形成头尾相接的循环等待资源关系

并发 Bug:数据竞争 (Data Race)

数据竞争

不同的线程同时访问同一段内存,且至少有一个是写。

Peterson 算法告诉大家:

你们写不对无锁的并发程序,所以事情反而简单了

用互斥锁保护好共享数据,消灭一切数据竞争

其他类型并发Bug

原子性违反(AV)

顺序违反(Ov)

应对并发Bug的方法

Lockedep

ThreadSanitizer

更多的检查:动态程序分析

动态分析工具:Sanitizers

总结

  • 常见的并发 bug
    • 死锁、数据竞争、原子性/顺序违反
  • 不要盲目相信自己:检查、检查、检查
    • 防御性编程:检查
    • 动态分析:打印 + 检查
  • Copyrights © 2019-2024 Hxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信