本文共 1864 字,大约阅读时间需要 6 分钟。
往往我们发现的HWT看门狗问题:都是CPU间共享资源互锁造成的(即R 状态死锁),所以后续当发现HWT问题时,不要只是关注具体直接导致HWT对应的那个CPU核的堆栈信息,我们必须要查看每一个CPU堆栈信息。---------------其实往往此种问题是由于其它cpu核访问资源异常时死在了锁里,而等待获取资源的cpu核(直接报问题的核)由于长时间不能等到锁被释放造成被看门狗复位。
死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。
Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。
常见错误
下面举一个ABBA死锁类型的例子:
假设有两处代码(比如不同线程的两个函数 thread_P 和 thread_Q)都要获取两个锁(分别为 lockA 和 lockB),如果 thread_P 持有 lockA 后再去获取 lockB,而此时恰好由 thread_Q 持有 lockB 且它也正在尝试获取 lockA,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的 AB-BA 死锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | thread_P ( ) { . . . . . . spin_lock ( & lockA ) ; spin_lock ( & lockB ) ; spin_unlock ( & lockA ) ; spin_unlock ( & lockB ) ; . . . . . . } thread_Q ( ) { . . . . . . spin_lock ( & lockB ) ; spin_lock ( & lockA ) ; spin_unlock ( & lockB ) ; spin_unlock ( & lockA ) ; . . . . . . } |
转载地址:http://ptktd.baihongyu.com/