建筑工程网官网招聘资料员,丹阳seo公司,阅读网站建设规划书,做模板网站简单吗简介
android系统中SystemServer WatchDog的主要作用是监控SystemServer进程的运行状态,防止其卡住或者死锁。
具体来说,watchDog线程会定期去检查SystemServer线程的运行情况。如果发现SystemServer线程超过一定时间未有响应,watchDog会认为SystemServer进程发生了问题,这时…简介
android系统中SystemServer WatchDog的主要作用是监控SystemServer进程的运行状态,防止其卡住或者死锁。
具体来说,watchDog线程会定期去检查SystemServer线程的运行情况。如果发现SystemServer线程超过一定时间未有响应,watchDog会认为SystemServer进程发生了问题,这时它会采取以下行动:
1. 打印出SystemServer线程当前的堆栈信息,以帮助定位问题。 日志格式如下Blocked in monitor(monitor 不为空)|Blocked in handler onmonitor为空
2. 重启SystemServer进程。watchDog线程会先杀死已卡住的SystemServer进程,然后重新fork出一个新的SystemServer进程。
通过这种机制,watchDog线程可以像一只“看门狗”一样时刻监视SystemServer的状态,一旦发现SystemServer发生故障,就可以及时采取行动重启它,从而提高系统的健壮性和稳定性。watchDog线程在系统启动时由Init进程 fork 出,它需要持续运行以保护 SystemServer 不会发生故障时无人管控的情况 实现方式
通过监听system_server进程中时间敏感线程的调度时间来判断进程当前是否卡顿或者长时间持锁
WatchDog初始化 //system_server前台线程mMonitorChecker new HandlerChecker(FgThread.getHandler(),foreground thread);mHandlerCheckers.add(withDefaultTimeout(mMonitorChecker));// Add checker for main thread. We only do a quick check since there// can be UI running on the thread.//system_server主线程mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(new Handler(Looper.getMainLooper()), main thread)));// Add checker for shared UI thread. system_server ui线程mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(UiThread.getHandler(), ui thread)));// And also check IO thread.mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(IoThread.getHandler(), i/o thread)));// And the display thread.mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(DisplayThread.getHandler(), display thread)));// And the animation thread. system_server 动画执行线程mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(AnimationThread.getHandler(), animation thread)));// And the surface animation thread.mHandlerCheckers.add(withDefaultTimeout(new HandlerChecker(SurfaceAnimationThread.getHandler(),surface animation thread)));//检测是否binder线程池耗尽addMonitor(new BinderThreadMonitor());WatchDog中循环 public class Watchdog implements Dumpable {private void run() {boolean waitedHalf false;while (true) {for (int i0; imHandlerCheckers.size(); i) {HandlerCheckerAndTimeout hc mHandlerCheckers.get(i);//向handler中插入空消息或者monitor检测消息hc.checker().scheduleCheckLocked(hc.customTimeoutMillis().orElse(watchdogTimeoutMillis * Build.HW_TIMEOUT_MULTIPLIER));}long start SystemClock.uptimeMillis();while (timeout 0) {//睡眠半个检测周期后检测消息是否得到及时处理mLock.wait(timeout);}final int waitState evaluateCheckerCompletionLocked();if (waitState COMPLETED) {// The monitors have returned; resetwaitedHalf false;continue;} else if (waitState WAITING) {continue;} else if (waitState WAITED_HALF) {if (!waitedHalf) {Slog.i(TAG, WAITED_HALF);waitedHalf true;blockedCheckers getCheckersWithStateLocked(WAITED_HALF);subject describeCheckersLocked(blockedCheckers);pids new ArrayList(mInterestingJavaPids);doWaitedHalfDump true;} else {continue;}} else {//所有超时的handlerblockedCheckers getCheckersWithStateLocked(OVERDUE);subject describeCheckersLocked(blockedCheckers);allowRestart mAllowRestart;pids new ArrayList(mInterestingJavaPids);}} //打印handler消息logWatchog(doWaitedHalfDump, subject, pids);//杀掉system_server进程Process.killProcess(Process.myPid());System.exit(10);}public final class HandlerChecker implements Runnable {public void scheduleCheckLocked(long handlerCheckerTimeoutMillis) {mWaitMax handlerCheckerTimeoutMillis;if (mCompleted) {// Safe to update monitors in queue, Handler is not in the middle of workmMonitors.addAll(mMonitorQueue);mMonitorQueue.clear();}//如果当前monitors为空并且消息队列中无消息if ((mMonitors.size() 0 mHandler.getLooper().getQueue().isPolling())|| (mPauseCount 0)) {mCompleted true;return;}if (!mCompleted) {// we already have a check in flight, so no needreturn;}mCompleted false;mCurrentMonitor null;mStartTime SystemClock.uptimeMillis();//把自身post到队列中检测mMonitors耗时如果mMonitors为空则仅检测handler中是否有阻塞消息mMonitors中大多是检测锁对象是否及时释放mHandler.postAtFrontOfQueue(this);}Overridepublic void run() {final int size mMonitors.size();for (int i 0 ; i size ; i) {synchronized (mLock) {mCurrentMonitor mMonitors.get(i);}mCurrentMonitor.monitor();}synchronized (mLock) {mCompleted true;mCurrentMonitor null;}}}} WatchDog addMonitor
//frameworks/base/services/core/java/com/android/server/Watchdog.javapublic void addMonitor(Monitor monitor) {synchronized (mLock) {mMonitorChecker.addMonitorLocked(monitor);}
}//frameworks/base/services/core/java/com/android/server/Watchdog$HandlerChecker.javavoid addMonitorLocked(Monitor monitor) {mMonitorQueue.add(monitor);}//frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java//单纯检测是否有方法长时间持有锁 public void monitor() {synchronized (this) { }}
//frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
//检测是否持有一系列锁
public void monitor() {synchronized (mInputFilterLock) { }synchronized (mAssociationsLock) { /* Test if blocked by associations lock. */}synchronized (mLidSwitchLock) { /* Test if blocked by lid switch lock. */ }synchronized (mInputMonitors) { /* Test if blocked by input monitor lock. */ }synchronized (mAdditionalDisplayInputPropertiesLock) { /* Test if blocked by props lock */ }mBatteryController.monitor();mNativeInputManger.monitor();}//frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
//分别检测reader writer线程是否有阻塞任务
static void nativeMonitor(JNIEnv* env, jobject nativeImplObj) {NativeInputManager* im getNativeInputManager(env, nativeImplObj);im-getInputManager()-getReader().monitor();im-getInputManager()-getDispatcher().monitor();
}
//frameworks/native/services/inputflinger/reader/InputReader.cpp
//inputReader Thread是否有长时间未读取的消息
void InputReader::monitor() {std::unique_lockstd::mutex lock(mLock);mEventHub-wake();mReaderIsAliveCondition.wait(lock);// Check the EventHubmEventHub-monitor();
} 文章转载自: http://www.morning.xhfky.cn.gov.cn.xhfky.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.dmwck.cn.gov.cn.dmwck.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.rlcqx.cn.gov.cn.rlcqx.cn http://www.morning.mwlxk.cn.gov.cn.mwlxk.cn http://www.morning.qctsd.cn.gov.cn.qctsd.cn http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.rjrh.cn.gov.cn.rjrh.cn http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn http://www.morning.srtw.cn.gov.cn.srtw.cn http://www.morning.rkmhp.cn.gov.cn.rkmhp.cn http://www.morning.wtcbl.cn.gov.cn.wtcbl.cn http://www.morning.rmrcc.cn.gov.cn.rmrcc.cn http://www.morning.wiitw.com.gov.cn.wiitw.com http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn http://www.morning.snmsq.cn.gov.cn.snmsq.cn http://www.morning.ctswj.cn.gov.cn.ctswj.cn http://www.morning.hwnqg.cn.gov.cn.hwnqg.cn http://www.morning.ztcxx.com.gov.cn.ztcxx.com http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.ghphp.cn.gov.cn.ghphp.cn http://www.morning.xyrw.cn.gov.cn.xyrw.cn http://www.morning.zczkm.cn.gov.cn.zczkm.cn http://www.morning.tzzfy.cn.gov.cn.tzzfy.cn http://www.morning.pxbky.cn.gov.cn.pxbky.cn http://www.morning.tcsdlbt.cn.gov.cn.tcsdlbt.cn http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn http://www.morning.dpflt.cn.gov.cn.dpflt.cn http://www.morning.kqbjy.cn.gov.cn.kqbjy.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.rzmlc.cn.gov.cn.rzmlc.cn http://www.morning.2d1bl5.cn.gov.cn.2d1bl5.cn http://www.morning.wbhzr.cn.gov.cn.wbhzr.cn http://www.morning.dcmnl.cn.gov.cn.dcmnl.cn http://www.morning.pjfmq.cn.gov.cn.pjfmq.cn http://www.morning.crrmg.cn.gov.cn.crrmg.cn http://www.morning.fgsqz.cn.gov.cn.fgsqz.cn http://www.morning.gjws.cn.gov.cn.gjws.cn http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn http://www.morning.crsnb.cn.gov.cn.crsnb.cn http://www.morning.mrnnb.cn.gov.cn.mrnnb.cn http://www.morning.cqyhdy.cn.gov.cn.cqyhdy.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.mcqhb.cn.gov.cn.mcqhb.cn http://www.morning.dgmjm.cn.gov.cn.dgmjm.cn http://www.morning.ysmw.cn.gov.cn.ysmw.cn http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn http://www.morning.nchlk.cn.gov.cn.nchlk.cn http://www.morning.jwfkk.cn.gov.cn.jwfkk.cn http://www.morning.ktnmg.cn.gov.cn.ktnmg.cn http://www.morning.jtmrx.cn.gov.cn.jtmrx.cn http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn http://www.morning.dighk.com.gov.cn.dighk.com http://www.morning.skbhl.cn.gov.cn.skbhl.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.bnbtp.cn.gov.cn.bnbtp.cn http://www.morning.qnhpq.cn.gov.cn.qnhpq.cn http://www.morning.wmrgp.cn.gov.cn.wmrgp.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.qrwdg.cn.gov.cn.qrwdg.cn http://www.morning.zmlnp.cn.gov.cn.zmlnp.cn http://www.morning.pyncm.cn.gov.cn.pyncm.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.btypn.cn.gov.cn.btypn.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.ysbhj.cn.gov.cn.ysbhj.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.clfct.cn.gov.cn.clfct.cn http://www.morning.sfwfk.cn.gov.cn.sfwfk.cn http://www.morning.yckrm.cn.gov.cn.yckrm.cn http://www.morning.lxyyp.cn.gov.cn.lxyyp.cn http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.bktzr.cn.gov.cn.bktzr.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn