swwd

来源:互联网 发布:mplayerx mac dmg 编辑:程序博客网 时间:2024/05/19 00:49

Android SWWD 机制总结

代码路径

/frameworks/base/services/core/java/com/android/server/Watchdog.java

Software Watchdog

该机制属于debug机制,用于发现导致system server工作卡钝的Bug。确保system server进程能够及时为各个客户端提供服务。从而保证整个系统的流畅性。

可能导致swwd的原因

  1. system server进程内,线程间的block
  2. system server进程内对外binder调用返回迟缓
  3. system server进程内代码执行效率不够
  4. cpu busy导致system server代码执行迟缓
  5. oom 导致cpu负载过高等等。

swwd机制原理

这里写图片描述
Watchdog线程的run是一个while循环,每一次循环就是开始新一轮的检查,首先HandlerChecker发送到对应的线程中,设置timeout, 然后开始wait(timeout);
timeout到时间了,会逐个检查HandlerChecker的状态,如果状态都正常,进行下一次循环检查,如果有未完成状态,决定是否再等待一次循环,还是进行dump处理。

根本上讲,watchdog检查的基本对象是system_server进程的线程,对应到Watchdog.java中的对象就是HandlerChecker,一个HandlerChecker是一个Runnable,一个HandlerChecker持有一个Handler,对应一个线程,每循环一次检查时,使用Handler将HandlerChecker对象本身post到Handler对应的线程,HandlerChecker的run函数中会设置相应的标志,如果HandlerChecker对应的线程能够顺畅运行,相应的标志会及时得到更新,一个HandlerChecker对象也可以持有多个Monitor对象,run函数也会检查是否是Monitor对象的资源竞争导致block。watchdog中有一个专门检查Monitor对象的HandlerChecker,调用Watchdog.addMonitor会将monitor添加到该HandlerChecker中保存。
目前的SWWD实现中,有四个默认线程负责轮询HandlerChecker,也就是这个四个线程被检查是否有卡顿。可以用Watchdog. addThread函数来增加线程。
FgThread,UiThread,IoThread以及MainThread。

swwd的启动

android.server.ServerThread是system server进程的主消息循环线程,线程的入口是SystemServer.java的main()

SystemServer.java:main()
{
ServerThread thr = new ServerThread();
thr.initAndLoop();
}

ServerThread: initAndLoop
{
Looper.prepareMainLooper();
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Watchdog.getInstance().start();
,,,,,,,,,,,,,,,,,,
Looper.loop();
}

线程间死锁的常见示例

最常见的是锁中带锁,尽量避免锁中锁的代码出现
线程1:

{    sync(A)    {        sync(B)    }}

线程2:

{    sync(B)    {        sync(A)    }}

如果出现下面时序,就会死锁
线程1.sync(A)
线程2.sync(B)
线程1.sync(B) //等待
线程2.sync(A) //等待

0 0