死锁

  • 1.死锁的产生
  • 2.处理死锁
    • 2.1预防死锁
    • 2.2 避免死锁
  • 3.死锁检测和死锁解除
    • 3.1JAVA如何检查死锁
    • 面试官:用代码模拟死锁??!!(这里用Synchronized模拟,也可以用ReentrantLock!!)
    • Jstack
    • Jconsole

1.死锁的产生

死锁是在一组进程中的每一个进程都占有了资源,并且都在等待其他进程所占有的资源,这样会导致进程无限期等待下去,无法推进
产生死锁的4个条件

2.处理死锁

目前处理死锁的方法主要有以下4种

2.1预防死锁

所谓预防死锁,就是要破坏产生死锁的4个条件中的一个或几个,预防死锁是一种较容易实现的方式,已被广泛使用

我们给资源加锁的目的,就是为了限制进程互斥访问共享资源,因此不考虑破坏互斥条件!!

  • 破坏持有并等待条件

该条件是进程获取了一部分资源,并且请求其他资源,如果要破坏该条件,那么可以让进程获取到需要的全部资源,如果获取不到,就进入等待,然后释放掉占用的部分资源

这样的确可以预防死锁,但是一个进程在不同的时间段所需要的资源是不同的,如果一上来就占用到全部资源,这样会导致系统的利用率极低,容易造成饥饿,其他进程久久获取不到资源

针对JAVA开发中,我们可以尝试在加锁时,设置超时时间,如果在规定时间内没有获取到锁,则释放已经获取到的资源

具体对用可以使用ReentrantLock中的tryLock方法
注意不能使用Synchronized,因为Synchornized获取不到锁,会阻塞等待,不会释放已经占有的资源!!!

  • 破坏无抢占条件

该条件是值进程所占有的资源只能由自己来释放,不能让其他进程所抢占,如果要破坏该条件,那么一个办法就是把占有资源的进程kill掉,这显然不可取!!

  • 破坏循环等待条件
    可以读资源类型进行排序,然后让进程按照资源的排序顺序来申请,统一递增或递减,这样就不会形成环
    (这种措施在嵌入式操作系统中使用较多,因为嵌入式操作系统中资源类型有限,固定!)

比如下面线程A和线程B,申请获取资源的顺序不同,那么就有可能造成死锁!
如果我们让A,B都按照相同的顺序申请资源,比如都先申请a,再申请b,这样就不会造成死锁

针对JAVA来说k,我们可以给锁对象按照hashCode的大小排序,然后按照这个顺序来获取锁,但是这种方法只适用于线程数,资源数较少的情况,如果过多,那么应该使用银行家算法(下文!!)

2.2 避免死锁

`在死锁避免中,把系统的状态分为安全状态和不安全状态,当进程申请资源时,检测系统的状态,如果系统处于安全状态时,那么可以把资源分配给进程,反之,当系统处于不安全状态时,此时不应该分配资源给进程,让进程等待,因为不安全状态下分配资源给进程可能会引起死锁!!
注意是可能引起死锁!!!不是一定会引起死锁!!

最具有代表性的死锁避免算法是银行家算法,是一种动态的检测资源分配状态的算法!
某个进程请求资源,先假定分配给该进程,如果分配后系统的状态是安全的(找到一个安全序列),那么就可以分配,否则不嫩分配!!
链接: 银行家算法.

银行家算法中的数据结构
  为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述系统中可利用的资源、所有进程对资源的最大需求、系统中的资源分配,以及所有进程还需要多少资源的情况。
  (1) 可利用资源向量 Available。这是一个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果 Available[j] = K,则表示系统中现Rj类资源K个。
  (2) 最大需求矩阵Max。这是一个n x m的矩阵,它定义了系统中n个进程中的每个进程对m类资源的最大需求。如果Max[i,j] = K,则表示进程i需要Rj 类资源的最大数目为K。
  (3) 分配矩阵 Allocation。这也是一个n x m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 Allocation[i,jl = K,则表示进程i当前己分得Rj类资源的数目为K。
  (4) 需求矩阵Need.这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j] = K,则表示进程i还需要Rj类资源K个方能完成其任务。
上述三个矩阵间存在下述关系:
              Need[i,j] = Max[i,j] - allocation[i, j]

举例说明:

假设此时P1进程需要请求资源(1,0,1),那我们先假设分配给P1

此时再判断系统的安全状态,发现此时Available中为(0,1,1),不能使系统处于安全状态,因此不能响应P1进程的请求!!!


如果在系统中既不采取预防措施,也没有死锁避免算法,系统很可能发生死锁,此时应该提供死锁检测算法和死锁解除算法

3.死锁检测和死锁解除

死锁检测可以使用资源分配图,其中包括资源节点和进程节点,然后转化为等待图,如果等待图中有环,则产生死锁,否则没有死锁!!

当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:

剥夺资源:从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。

3.1JAVA如何检查死锁

面试官:用代码模拟死锁??!!(这里用Synchronized模拟,也可以用ReentrantLock!!)

public static void main(String[] args) {final Object a = new Object();final Object b = new Object();Thread threadA = new Thread(new Runnable() {public void run() {synchronized (a) {try {System.out.println("now i in threadA-locka");Thread.sleep(1000l);synchronized (b) {System.out.println("now i in threadA-lockb");}} catch (Exception e) {// ignore}}}});Thread threadB = new Thread(new Runnable() {public void run() {synchronized (b) {try {System.out.println("now i in threadB-lockb");Thread.sleep(1000l);synchronized (a) {System.out.println("now i in threadB-locka");}} catch (Exception e) {// ignore}}}});threadA.start();threadB.start();
}

Jstack

jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息
具体操作是:
首先利用JPS找到当前进程的ID,然后利用Jstack -F 进程ID,查看当前进程对应的堆栈信息

Jconsole

Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到。它用于连接正在运行的本地或者远程的JVM,对运行在Java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面。而且本身占用的服务器内存很小,甚至可以说几乎不消耗。

我们在命令行中敲入jconsole命令,会自动弹出以下对话框,选择产生死锁的对应进程即可查看!!

春招冲刺Day2 [操作系统] --来聊聊死锁呗?相关推荐

  1. 春招冲刺Day2 [高频算法题] -- 一网打尽快排

    一网打尽快排 1.初出茅庐 2.小试牛刀 3.炉火纯青(快排) 4.登峰造极(随机快排) 快速排序作为十大经典排序算法之一,在面试场中屡屡出现,不是要求手写快速排序,就是快速排序的变种,为了方便复习, ...

  2. 春招快来了,杭电研究生学长聊聊踩过的坑,助你成功上岸

    引言 大家好,我是James,由于之前文章内容浏览量太少以及这几个月的繁忙,一直没有静下心输出一些内容,随着疫情放开,新春来临,年后百业待兴,马上又是一年春季招聘.作为一个参加过2022年春,秋招面试 ...

  3. 春招+秋招面试经历汇总,今天我们聊聊程序员应该进大厂还是国企(Java后端方向)

    前言: 魔幻的2022已经半年快结束了,突如其来的疫情,以及疫情导致的全球经济下滑,使得22年春招比以往更难,竞争压力也更大.本帖旨在记录楼主本人经历过且了解到的最新的春招信息,希望能给今年春招和以后 ...

  4. 以过来人的身份聊聊实习招聘、秋招、春招(给应届毕业生)

     没有学长.学姐能够清楚地告诉我,这些东西的意义.我自己从大三暑期到大四把这三个阶段完整地经历过了,当然因为自己想法多多,心高气傲,无视实习机会,无视秋招.在春招的时候,苦逼求一个面试机会,很多时间就 ...

  5. 2019秋招|从春招到秋招,Java岗经验总结(收获AT)

    前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最终都能去到属于自己理想的地方. 从春招到秋招,我总计面试了数十家公司.春招面试了腾讯.去哪儿.360.小米.携程.华为.今日头条.美 ...

  6. 天道酬勤,记春招之路(完美世界,360,腾讯IEG,网易雷火)

    一.前言 先说说自己的一些情况吧,本人来自双非一本理工科学校,软件工程大三学生.大学期间参加过ACM竞赛,也进过实验室做过项目.主要学习的语言是C++,但是项目开发却是用的Unity+C#进行项目开发 ...

  7. [找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)

    转自(有更多) https://blog.csdn.net/zj15527620802/article/month/2018/10 前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最 ...

  8. 我的阿里春招之路:历时14天,五轮面试后终于拿到Android岗offer,原来大厂都是从这几个方面问问题

    分享一波春招面试经历:一点点征服 去年参加了阿里春招,有幸最终拿到阿里offer,base杭州,岗位客户端开发.一直忙于其他事情,拿到意向已经过去许久,在此分享一些关于面试的干货,攒一波RP,回馈社会 ...

  9. 双非研二师弟的春招总结和实习感悟

    大家好,我是阿秀. 考虑到最近校招提前批已经开始了,最近会多分享一些校招秋招经验! 前段时间有位研二师弟经过自己的努力终于拿到了字节和腾讯的offer,跟我分享他春招过程和实习感悟,我感觉还是挺有意义 ...

最新文章

  1. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法
  2. 博士在读却连矩阵的秩都搞不清,我该如何毕业?|Reddit热议
  3. 20年吐血整理:程序员全栈体系化学习路线与进阶地图
  4. linux命令头部,Linux命令学习手册-objcopy命令
  5. java获取机器号_(转)JAVA获得机器码的实现
  6. android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现
  7. c语言uint8的数组怎么转换为uint32_剖析JS和Redis的数据结构设计:数组
  8. SPOJ NSUBSTR(后缀自动机)
  9. 微信小程序之旅一(页面渲染)
  10. mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
  11. JavaBean的实用工具Lombok(省去get、set等方法)
  12. 在D365/AX2012中设计SSRS
  13. 【滤波跟踪】基于多源信息融合算法实现多旋翼无人机组合导航系统含Matlab源码
  14. mac 截图工具| Snipaste
  15. PCIe扫盲——PCIe总线怎样做到在软件上兼容PCI总线
  16. 模板设计模式的两种方式
  17. mysql区间算法_「五大常用算法」一文图解分治算法和思想
  18. ubuntu下无线网络网速缓慢问题解决
  19. 亚信科技笔试java
  20. “C9、国防七子、两电一邮、两财一贸”...,你知道几个大学的称号?

热门文章

  1. PCI总线的桥与配置(二)
  2. 两经纬度点之间的距离计算方法
  3. MFC:AfxMessageBox函数随记
  4. MFC—— AfxMessageBox
  5. Selenium——浏览器设置
  6. 关于滴滴出行APP的一些思考
  7. 如何使用密码管理器-Enpass管理个人密码(macos、win10、Android亲测)
  8. android wear 配对找不到手表,如何将多个Android Wear手表与单个手机配对 | MOS86
  9. 什么蓝牙耳机打游戏好用?游戏蓝牙耳机品牌推荐
  10. Serializable