当前位置:   article > 正文

如何面对并发下的bug

如何面对并发下的bug

整理总结自蒋炎岩老师的b站课程,https://jyywiki.cn/OS/2022/index.html

并发bug与应对

  • 应对bug的方法

    • 在代码里边增加很多检查(加断言)

      • #include "thread.h"
        
        unsigned long balance = 100;
        
        void Alipay_withdraw(int amt) {
          if (balance >= amt) {
            usleep(1); // unexpected delays
            balance -= amt;
          }
          assert(balance <= 10000000);
        }
        
        void Talipay(int id) {
          Alipay_withdraw(100);
        }
        
        int main() {
          create(Talipay);
          create(Talipay);
          join();
          printf("balance = %lu\n", balance);
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
    • 防御性编程:把程序需要满足的条件用 assert 表达出来。

      • 在这里插入图片描述

      • assert()

      • 在这里插入图片描述

  • 并发bug:死锁 (Deadlock)

    • A deadlock is a state in which each member of a group is waiting for another member, including itself, to take action.

    • ABBA-Deadlock

      • void swap(int i, int j) {
          spin_lock(&lock[i]);
          spin_lock(&lock[j]);
          arr[i] = NULL;
          arr[j] = arr[i];
          spin_unlock(&lock[j]);
          spin_unlock(&lock[i]);
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
      • 上锁的顺序很重要……

        • swap 本身看起来没有问题,swap(1, 2); swap(2, 3), swap(3, 1) → 死锁
    • 避免死锁

      • 死锁产生的四个必要条件

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

        • 在临界条件检测
        • spinlock-xv6.c中的各种防御性编程
          • if (holding(lk)) panic();
      • ABBA-Deadlock

        • 任意时刻系统中的锁都是有限的

        • 严格按照固定的顺序获得所有锁 (lock ordering; 消除 “循环等待”)

        • class LockOrdering:
              locks = [ '', '', '' ]
          
              def tryacquire(self, lk):
                  self.locks[lk], seen = '
          声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/557194
推荐阅读
相关标签