`
y150988451
  • 浏览: 195050 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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进程。

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");
}
分享到:
评论

相关推荐

    s3c2410 watchdog详解

    watchdog,中文名称叫做“看门狗”,全称watchdog timer,从字面上我们可以知道其实它属于一种定时器。然而它与我们平常所接触的定时器在作用上又有所不同。

    嵌入式原理与实践(实验四)

    (2) 学习和理解看门狗“External watchdog monitor”“Software watchdog” 【1】 分析“External watchdog monitor”的功能 【2】 分析“Software watchdog”的功能 【3】 阅读参考资料MK10DN32VLH5.PDF中...

    s3c2410启动代码详解

    s3c2410启动代码详解 s3c2410启动代码详解 s3c2410启动代码详解

    详解linux 看门狗驱动编写

    看门狗是linux驱动的一个重要环节。某些特殊的设备,有时候需要放在一些环境...drivers/watchdog 2、阅读目录下的Kconfig,可以找一个s3c模块macro config HAVE_S3C2410_WATCHDOG bool help This will include wa

    PIC单片机的清零指令详解

    看门狗定时器清零(若已赋值,同时清预分频器)说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。3.寄存器f清零指令。指令格式:CLRF f实例:CLRF TMRO;对TMRO清零说明:在PIC系列...

    基于msp430g2553定时器详解

    // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ CCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较...

    嵌入式系统/ARM技术中的AVR看门狗使用范例 avr wdt看门狗详解

     //Watchdog initialize  // prescale: 2048K  void watchdog_init(void)  {  WDR(); //this prevents a timout on enabling  WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs  }  ...

    详解解决Python memory error的问题(四种解决方案)

    主要介绍了详解解决Python memory error的问题(四种解决方案),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    嵌入式Linux之我行系列

    ·嵌入式Linux之我行——S3C2440上看门狗(Watchdog)驱动开发实例讲解 ·嵌入式Linux之我行——S3C2440上ADC驱动实例开发讲解 ·嵌入式Linux之我行——S3C2440上触摸屏驱动实例开发讲解 ·嵌入式Linux之我行——S3C...

    《深入理解Android》卷Ⅰ

    4.5.3 Watchdog分析 4.6 本章小结 第5章 深入理解常见类 5.1 概述 5.2 以“三板斧”揭秘RefBase、sp和wp 5.2.1 第一板斧--初识影子对象 5.2.2 第二板斧--由弱生强 5.2.3 第三板斧--破解生死魔咒 5.2.4 轻量级的引用...

    hotplug:OpenWRT 的热插拔工具

    Hotplug即热插拔,在新版本OpenWRT上,hotplug,coldplug与watchdog等被集成到全新的Procd系统中。 Procd是OpenWRT下新的预初始化,初始化,热插拔和事件系统。在openwrt 中, procd 作为 init 进程会处理许多事情, ...

    硬件工程师手册(全)

    硬件开发规范化管理 5 第一节 硬件开发流程 5 §3.1.1 硬件开发流程文件介绍 5 §3.2.2 硬件开发流程详解 6 第二节 硬件开发文档规范 9 §2.2.1 硬件开发文档规范文件介绍 9 §2.2.2 硬件开发文档...

    VxWorks实验指导书

    4.5、UPTECH2410 的 LCD 开发流程详解 ...................................... 41 4.5.1 WindML 的 BSP 修改 ............................................. 41 4.5.2 LCD 配置文件的建立 ........................

Global site tag (gtag.js) - Google Analytics