Android 10 包含 Android Live-LocK 守护程序 (llkd),该守护程序旨在发现和减少内核死锁问题。llkd 组件提供默认的独立实现,但您也可以选择将 llkd 代码集成到其他服务中(作为主循环的一部分或作为单独的线程)。
检测场景
llkd 有两种检测场景:一种是持久 D 状态或 Z 状态,另一种是持久堆栈签名。
持久 D 状态或 Z 状态
如果某个线程一直处于 D(不间断休眠)状态或 Z(僵死)状态且超过 ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms 没有任何进展,llkd 就会终止该进程(或父进程)。如果后续扫描显示同一进程仍然存在,llkd 会确认活锁情况,并通过提供有关该情况的最详细错误报告向内核发出紧急警报。
llkd 包含一个自监控定时器,会在 llkd 锁定时发出警报;监控定时器的时间是主循环预计循环时间的两倍,采样频率为 ro.llk_sample_ms 一次。
持久堆栈签名
对于 userdebug 版本,llkd 可以使用持久堆栈签名检查来检测内核活锁。如果处于 Z 状态以外任意状态的线程持久列出 ro.llk.stack 内核符号,且这种情况的持续时间超过 ro.llk.timeout_ms 或 ro.llk.stack.timeout_ms,llkd 就会终止该进程(即使向前调度作业仍在继续也会终止该进程)。如果后续扫描显示同一进程仍然存在,llkd 会确认活锁情况,并通过提供有关该情况的最详细错误报告向内核发出紧急警报。
注意:由于系统允许向前调度作业继续执行,因此 llkd 不会执行 ABA 检测。
lldk 检查会在活锁情况存在期间持续进行,并在 Linux 上的 /proc/pid/sta