Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.

1. 现象::主程序卡住无反应,多行任务不往下执行 1

2. 原因::使用jv jprofile查看线程,原来俩个线程死锁了。。 1

3. Java的缺点,默认不能自动解除死锁 1

4. 自动检测与解除死锁::使用看门狗watchdog 2

4.1. 死锁检测算法(太麻烦,不推荐) 2

4.2. 硬件看门狗 2

4.3. 软件看门狗的实现--TIMER 2

4.4. LINUX的watchdog 2

5. 解除死锁策略 3

5.1. 程序复位 3

5.2.      撤消线程,剥夺资源。 3

5.3. 进程回退策略, 3

6. 任务恢复---事务重做 3

7. 手动解除死锁 3

8. Watchdog原理and实现 4

9. Java的watchdog设计思路 4

10. 简单的会产生死锁现象的例子, 5

11. 参考 5

1. 现象::主程序卡住无反应,多行任务不往下执行

程序的跑飞,而陷入死循环,程序的正常运行被打断, 系统无法继续工作,会造成整个系统的陷入停滞状态,

2. 原因::使用jv jprofile查看线程,原来俩个线程死锁了。。

3. Java的缺点,默认不能自动解除死锁

不像数据库,许多数据库都可以自动解除死锁,然后安排事务重做。。

Java的语言级别无此功能,只能自己在类库级别实现次功能了。。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

4. 自动检测与解除死锁::使用看门狗watchdog

死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而使得并发进程从死锁状态中恢复出来。

4.1. 死锁检测算法(太麻烦,不推荐)

4.2. 硬件看门狗

专门用于监测程序运行状态的芯片

4.3. 软件看门狗的实现--TIMER

4.4. LINUX的watchdog

Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。[1]

分钟的定时器,此后,用户空间程序需要保证在 1分钟之内向这个设备写入数据,每次写操作会导致重新设定定时器。如果用户空间程序在 1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作。[1]

看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗, 正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定时间不喂狗(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到 复位. 防止 死机. 看门狗的作用就是防止程序发生死循环或者说程序跑飞。

5. 解除死锁策略

5.1. 程序复位

)最简单,最常用的方法就是进行系统的重新启动,不过这种方法代价很大,它意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程。

5.2.      撤消线程,剥夺资源。

终止参与死锁的进程,收回它们占有的资源,从而解除死锁。这时又分两种情况:一次性撤消参与死锁的全部进程,剥夺全部资源;或者逐步撤消参与死锁的进程,逐步收回死锁进程占有的资源。一般来说,选择逐步撤消的进程时要按照一定的原则进行,目的是撤消那些代价最小的进程,比如按进程的优先级确定进程的代价;考虑进程运行时的代价和与此进程相关的外部作业的代价等因素。

5.3. 进程回退策略,

即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁。虽然这是个较理想的办法,但是操作起来系统开销极大,要有堆栈这样的机构记录进程的每一步变化,以便今后的回退,有时这是无法做到的。

6. 任务恢复---事务重做

进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁。虽然这是个较理想的办法,但是操作起来系统开销极大,要有堆栈这样的机构记录进程的每一步变化,以便今后的回退,有时这是无法做到的

7. 手动解除死锁

包装系统thread ,每当启动线程的时候儿,向线程注册表格插入线程..退出的时候儿clr...

要是死锁兰,马clr,能查询,在手动clr...

8. Watchdog原理and实现

看门狗的应用,使系统可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和系统的一个I/O引脚相连(纯软件中通过一个变量相连),该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平,软件中是送入一个变量值),这一程序语句是分散地放在系统其他控制语句中间的,一旦系统由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到系统送来的信号,便在它和系统复位引脚相连的引脚上送出一个复位信号,使系统发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了系统的自动复位.

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清看门狗,那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以在使用有看门狗的芯片时要注意清看门狗。

硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使系统复位

软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51系统中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使系统复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的裕量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就构成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。

9. Java的watchdog设计思路

系统软件"看门狗"的设计思路:

1.看门狗定时器T0的设置。在初始化程序块中设置T0的工作方式,并开启中断(timer事件)和计数功能。

2.计算主控程序循环一次的耗时。考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为30。系统设置"看门狗"定时器T0定时60s

3.主控程序的每次循环都将刷新T0的初值。如程序进入"死循环"而T0的初值在60s内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。

3.设计T0溢出所对应的中断服务程序。此子程序只须一条指令,即在T0对应的中断向量地址(000BH)(JAVA中是一个线程的引用),写入复位,对任务重新进行初始化并获得正确的执行顺序

10. 简单的会产生死锁现象的例子,

参考Java出现死锁了? - 推酷.htm

11. 参考

atitit 提升数据库死锁处理总结 - attilax的专栏 - 博客频道 - CSDN.NET.htm

watchdog_百度百科.htm

java 死锁产生原因及解锁 - hijiankang的专栏 - 博客频道 - CSDN.NET.htm

Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.的更多相关文章

  1. atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39

    atitit.线程死锁 卡住无反应 的原因in cmd调用的解决方案  v3 q39 1. 问题::线程死锁  卡住无反应1 1.1. 分类:: cmd调用,  net io  , file  io  ...

  2. Atitit.android js 的键盘按键检测Back键Home键和Menu键事件

    Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...

  3. arm跑飞 分析

    当arm跑飞后,可以用ICE 追踪是哪边出错了: 1. 链接ICE, 修改Ice的mode,由 udf -> system. (因为跑飞了,在UDF) 2. 查看寄存器: LR对应callbac ...

  4. Delphi 在线程中如何使用TClientSocket组件并自动检测该组件

    在线程中如何使用TClientSocket组件并自动检测该组件的事件?我想在一个线程中动态创建一个TClientSocket组件,并要求该组件能够自动检测Socket事件(例如OnRead.OnErr ...

  5. 使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象

    如题(“使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象”). 今天使用ffmpeg进行宿放和颜色格式转换,很简单的代码,却折腾了我一天,这里说来就气啊 ...

  6. C# 最基本的涉及模式(单例模式) C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务,解决方案: C#关闭应用程序时如何关闭子线程 C#中 ThreadStart和ParameterizedThreadStart区别

    C# 最基本的涉及模式(单例模式) //密封,保证不能继承 public sealed class Xiaohouye    { //私有的构造函数,保证外部不能实例化        private  ...

  7. 记一次stm8l程序跑飞

    项目使用stm8l051f3做主控,CC2500做数据接收,不发送. 跑飞的现象就是,刚开始能运行,经过一段未知长度的时间,有可能是3分钟,有可能是30分钟,指示灯不再闪烁,中断按键单片机无反应. 接 ...

  8. RK3288 st7703 mipi屏指令过长,程序跑飞

    本文为博主原创文章,转载请注明出处:https://www.cnblogs.com/lialong1st/p/11218433.html CPU:RK3288 系统:Android 5.1 调试 mi ...

  9. 痞子衡嵌入式:IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞问题的分析解决经验. 事情缘起恩智浦官方论坛上的一 ...

随机推荐

  1. android——根据MVC框架设计的结构

  2. 《Android传感器高级编程》

    <Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...

  3. getmask

    #include "stdio.h" #include "stdlib.h" #include "string.h" #include &q ...

  4. 初学数位DP--hdu 2089

    其实是做topcoder的时候碰到不会的题,看人家说要用数位dp,所以拿http://acm.hdu.edu.cn/showproblem.php?pid=2089来学习了一下 数位dp适合在一段数的 ...

  5. Vue组件开发实践之scopedSlot的传递

    收录待用,修改转载已取得腾讯云授权 导语 现今的前端开发都讲究模块化组件化,即把公共的交互和功能封装到一个个的组件之中,在开发整体界面的时候就能像搭积木一样快速清晰高效.在使用Vue开发我们的vhtm ...

  6. Thinkphp学习笔记-删除缓存

    Thinkphp的缓存数据在Cach文件夹下的Home文件夹下的文临时文件 清除方法:将缓存文件删除就可以了

  7. springmvc 入门(1)

    1.1 Springmvc 本套课程基于spring4.X来讲解的 SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一 ...

  8. 利用 Android 系统原生 API 实现分享功能

    利用 Android 系统原生 API 实现分享功能 这篇文章提供一个封装好的 Share2 库供大家参考. GitHub 项目地址:Share2 大家知道,要调用 Android 系统内建的分享功能 ...

  9. 算法笔记_046:跳台阶问题(Java)

    目录 1 问题描述 2 解决方案 2.1 递归法 2.2 迭代法   1 问题描述 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法. 2 解决方案 2.1 递归法 如果整个台 ...

  10. Java网络编程-URI和URL

    前提 前面的一篇文章<Java中的Internet查询>分析完了如何通过IP地址或者主机名确定主机在因特网中的地址.任意给定主机上可能会有任意多个资源,这些资源需要有标识符方便主机之间访问 ...