android 下的 WATCHDOG(2)
来源:互联网 发布:公安信息化大数据应用 编辑:程序博客网 时间:2024/05/22 12:00
在前面的文章中对watchdog在应用的分析台细致。这有一篇思路清晰的关于watchdog在应用程序上的体现的文章:
现在的CPU基本上都带有WatchDog功能,这种硬件的WatchDog可以在系统死掉(死锁或者程序跑飞)后重启系统,让系统回到可以工作的状态。WatchDog不能防止系统死掉,但是它能够起死回生,从而提高系统的可用性。
硬件级的WatchDog也有它的局限性,它只能在系统范围内生效,不能针对单个进程,某个进程死掉了,WatchDog未必知道。对于像Linux这类久经考验的操作系统来说,整个系统死掉概率非常低,所以此时硬件级的WatchDog意义反而不大。
Android 平台实现了一个软件的WatchDog来监护SystemServer。SystemServer无疑是Android平台中最重要的进程了,里面运行了整个平台中绝大多数的服务。在这个进程中运行着近50个线程,任何一个线程死掉都可能导致整个系统死掉。SystemServer退出反而问题不大,因为 init进程会重新启动它,但是它死锁就麻烦了,因为整个系统就没法动了。
在 SystemServer里运行的服务中,最重要的几个服务应该数ActivityManager、WindowManager和 PowerManager。软件的WatchDog主要就是确保这几个服务发生死锁之后,退出SystemServer进程,让init进程重启它,让系统回到可用状态。
每个被监护的Service必须实现Watchdog.Monitor接口,这个接口只要实现一个函数monitor,这个函数实现非常简单,就拿ActivityManager来说吧:
public void monitor() { synchronized (this) { } }
它去锁一下对象,什么也不做,然后就返回。如果对象没有死锁,这个过程就会很顺利。如果对象死锁了,这个函数就会挂在这里。
当然实现Watchdog.Monitor接口还不够,还要把它注册到WatchDog服务中,在初始化时加这样一行代码就行了:
Watchdog.getInstance().addMonitor(this);
最后我们看看WatchDog服务的实现。WatchDog服务包括两个方面:
1.定期调用被监护对象的monitor函数,这是在主线程中完成的。如果被监护对象死锁,则会阻塞在这里。
final int size = mMonitors.size(); for (int i = 0 ; i < size ; i++) { mCurrentMonitor = mMonitors.get(i); mCurrentMonitor.monitor(); }
2.检测是否发生死锁,这是在Watchdog线程中运行的。如果发生死锁而且没有被调试,则退出SystemServer,init进程就会重启SystemServer进程。
// Only kill the process if the debugger is not attached. if (!Debug.isDebuggerConnected()) { Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name); Process.killProcess(Process.myPid()); System.exit(10); } else { Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process"); }
最近我们碰到一个问题,SystemServer不断重启:原来wifi模块死锁了,此时重启SystemServer,但是重启之后马上又死锁了,结果成了一个死循环。在这种情况下,我想还是在重启系统会好点。
- android 下的 WATCHDOG(2)
- android 下的 WATCHDOG(1)
- android 下的 WATCHDOG(3)
- linux下的watchdog
- linux 下的 WATCHDOG
- Linux下的Watchdog驱动
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(2)
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(2)
- Android Watchdog(看门狗)分析
- Android-Watchdog
- Android WatchDog
- Android watchdog
- Android framework Watchdog的监控过程
- 修改android系统和watchdog的延时
- Android framework Watchdog的监控过程
- Android Watchdog框架看门狗解析、死锁应用与改造(下)
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(1)
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(3)
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
- File/Directory Permission in Unix/Linux
- FPGA Verilog HDL 系列实例--------寄存器
- Qt 动画详解一
- Linux软连接和硬链接
- android 下的 WATCHDOG(2)
- 嵌入式Linux系统的构成
- Python main() functions by Guido van van Rossum
- (C#)WinForm窗体间传值
- 多个github帐号的SSH key切换
- 指针转换为整数 注意可移植性!
- OpenCV图片加载,显示,抠图与保存
- java远程连接工具
- warning C4541: 'dynamic_cast' used on polymorphic type 'class CWnd' with /GR-; unpredictable behavio