博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
看门狗深度解析
阅读量:2725 次
发布时间:2019-05-13

本文共 1864 字,大约阅读时间需要 6 分钟。

        往往我们发现的HWT看门狗问题:都是CPU间共享资源互锁造成的(即R 状态死锁),所以后续当发现HWT问题时,不要只是关注具体直接导致HWT对应的那个CPU核的堆栈信息,我们必须要查看每一个CPU堆栈信息。---------------其实往往此种问题是由于其它cpu核访问资源异常时死在了锁里,而等待获取资源的cpu核(直接报问题的核)由于长时间不能等到锁被释放造成被看门狗复位。

死锁概念

死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。

Linux 提供了检测死锁的机制,主要分为 D 状态死锁和 R 状态死锁。

  • D 状态死锁    进程等待 I/O 资源无法得到满足,长时间(系统默认配置 120 秒)处于 TASK_UNINTERRUPTIBLE 睡眠状态,这种状态下进程不响应异步信号(包括 kill -9)。如:进程与外设硬件的交互(如 read),通常使用这种状态来保证进程与设备的交互过程不被打断,否则设备可能处于不可控的状态。对于这种死锁的检测 Linux 提供的是 hung task 机制,MTK 也提供 hang detect 机制来检测 Android 系统 hang 机问题。触发该问题成因比较复杂多样,可能因为 synchronized_irq、mutex lock、内存不足等。D 状态死锁只是局部多进程间互锁,一般来说只是 hang 机、冻屏,机器某些功能没法使用,但不会导致没喂狗,而被狗咬死。
  • R 状态死锁  进程长时间(系统默认配置 60 秒)处于 TASK_RUNNING 状态垄断 CPU 而不发生切换,一般情况下是进程关抢占或关中断后长时候执行任务、死循环,此时往往会导致多 CPU 间互锁,整个系统无法正常调度,导致喂狗线程无法执行,无法喂狗而最终看门狗复位的重启。该问题多为原子操作,spinlock 等 CPU 间并发操作处理不当造成。本文所介绍的 Lockdep 死锁检测工具检测的死锁类型就是 R 状态死锁。

常见错误

  • AA: 重复上锁
  • ABBA: 曾经使用 AB 顺序上锁,又使用 BA 上锁
  • ABBCCA: 这种类型是 ABBA 的扩展。AB 顺序 , AB 顺序,CA 顺序。这种锁人工很难发现。
  • 多次 unlock

下面举一个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
)
;
    
.
.
.
.
.
.
}
当线程Q使用B锁的时候其实是解不了锁的,因为线程P就没有把B锁释放掉。-------切记:一定要注意顺序。

转载地址:http://ptktd.baihongyu.com/

你可能感兴趣的文章
Asp.net中GridView使用介绍
查看>>
mysql用户管理
查看>>
Mysql 定时任务的关闭
查看>>
windows下nginx的安装及使用
查看>>
Python:删除、增加字典的元素
查看>>
Django2全局配置settings详解
查看>>
Visual Studio2013 应用系列-Webservice使用
查看>>
Django2.0使用-自定义模板标签方式
查看>>
Django2.0使用-自定义错误页面
查看>>
Django3.0使用-模板引擎使用
查看>>
Django3.0使用-模板变量数据传递
查看>>
PostgreSQL使用-获取指定windows系统版本
查看>>
Django3.0使用-常用CBV介绍
查看>>
Vmware使用- 设置共享文件夹
查看>>
10大热门人工智能开源工具(框架)
查看>>
Java工程师该如何编写高效代码?
查看>>
Django3.0使用-国际化语言
查看>>
Django3.0使用-数据库设置
查看>>
Djano3.0使用-模型相关概念
查看>>
Djano3.0使用-模型使用
查看>>