死锁和哲学家就餐问题
死锁问题
多线程因访问锁资源不当,导致永久挂起,无法继续,程序功能瘫痪
死锁产生的四个必要条件
* 四个条件都满足,死锁才会发生,这也是避免死锁问题的重要提示
1. 请求与保持条件:线程占用自身资源后,还要请求其他线程占用的资源
2. 互斥条件:锁资源的特性就是互斥性,同一时刻只允许一个线程访问,其他线程访问则被系统挂起
3. 不可剥夺条件:一个线程占用了资源(lock)后,无法通过外力强制剥夺该资源,只能由占有者自行释放
4. 循环等待条件:多线程并发,资源有限的情况下,每个单位都在等待相应线程资源
哲学家就餐问题
多线程资源有限的情况下,如何合理使用资源
1,2,3,4,5 假设都为单只筷子
哲学家行为模式
就餐:哲学家会先拿左手边的资源再获取右手边的,这个顺序每个哲学家都一样,两个资源都获取到,完成进餐任务
思考:不做任何事情,不需要任何资源
* 哲学家行为模式不可预测,随机触发
死锁现象:哲学家同时进餐,每个人获取左手资源,等待请求右手资源,但是无法获取,产生等待环路,造成死锁现象(永久被挂起)饥饿
活锁现象:哲学家获取一个资源后,发现另一个被占用,自己无法进餐,礼貌机制触发,释放占用的资源,但是如果五个哲学家行为同步,产生活锁,频繁申请释放资源,最终一直处于饥饿状态
高权策略:某个哲学家权限最高,他要进餐可以想低权哲学家发送通知,其他哲学家放弃进餐(资源无法有效利用,有效资源被浪费)
服务者模式: 加入服务者单元,检测记录餐桌上资源占用情况,每个哲学家进餐是,询问服务者是否可以进餐,服务者根据餐桌上的情况进行反馈,在服务者的干预下,多个哲学家可以有序地进餐,资源可以被有效利用
银行家算法这里暂不介绍,有向了解的读者可以参考这篇文章
死锁和哲学家就餐问题相关推荐
- 利用记录型信号量解决不会出现死锁的哲学家就餐问题
试利用记录性信号量写出一个不会出现死锁的哲学家进餐问题的算法 规定在拿到左侧的筷子后,先检查右面的筷子是否可用.如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程. 分析:当出现以下情形,在某一 ...
- 多线程“死锁”之“哲学家就餐”代码实现
死锁:就是两个或者两个以上的线程相互占用对方的需要的资源,而不进行释放,导致彼此都在等待对方释放资源,产生了无限制的等待的现象. "哲学家就餐"的问题不在赘述,可以自行百度或者Go ...
- java中哲学家就餐死锁_哲学家就餐问题与死锁总结
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前 ...
- 哲学家就餐与死锁问题,死锁产生的条件以及解决方案
请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...
- 哲学家就餐问题--信号量和互斥量预防死锁
哲学家就餐问题可以采取预防死锁的方案,就是使用互斥量和信号量锁定资源. 互斥量: 对资源进行锁定的意思就是说,当一个哲学家使用叉子的时候,他首先要先把叉子锁定,然后,拿起来.这个时候如果别的哲学家也来 ...
- 哲学家就餐(避免死锁)(多进程版)
哲学家就餐(避免死锁)(多进程版) 哲学家就餐利用信号量在多进程之间实现 下面展示一些代码片段 #include <stdio.h> #include <unistd.h> # ...
- 哲学家就餐问题(如何避免死锁)(多线程版)
哲学家就餐问题 多线程编程中,常常会遇到线程间访问共享资源的问题,如果处理不当则会发生死锁,某一个线程可能永远访问不到共享资源. 为了避免死锁的发生,提出哲学家就餐问题. 下面展示一些代码片段 #in ...
- Java多线程学习四十二:有哪些解决死锁问题的策略和哲学家就餐问题
线上发生死锁应该怎么办 如果线上环境发生了死锁,那么其实不良后果就已经造成了,修复死锁的最好时机在于"防患于未然",而不是事后补救.就好比发生火灾时,一旦着了大火,想要不造成损失去 ...
- Thinking in Java---从哲学家就餐问题看死锁现象
我们知道一个对象可以有synchronized方法或其他形式的加锁机制来防止别的线程在互斥还没释放的时候就访问这个对象.而且我们知道线程是会变成阻塞状态的(挂起),所以有时候就会发生死锁的情况:某个任 ...
- 哲学家就餐问题的三种避免死锁的解法(PV操作)
哲学家就餐问题的三种避免死锁的解法(PV操作) 方案一:最多允许有四位哲学家同时去拿左边的筷子,然后再拿右边的筷子,最终保证至少有一位哲学家能够进餐,并在就餐完毕时同时释放他用过的两只筷子,从而使更多 ...
最新文章
- android 固定底部导航,如何设置android底部导航栏位置固定在android
- LeetCode动态规划 杨辉三角
- 护航Lazada双11购物节 阿里云CDN全球化火力全开
- 生死狙击服务器名字怎么修改,生死狙击端游怎么改名字,生死狙击端游怎么改名字?...
- mysql函数 字符长度限制_MySQL中使用group_concat()函数数据字符过长报错的问题解决方法...
- TOP 1%的软件工程师和其他 99%有什么不同?
- Linux之FineBI集群部署 1
- FISCO BCOS(八)——— 一键部署 WeBase
- Spring框架中constructor-arg与property理解
- UIView用户事件响应
- 教学软件哪个好用,推荐这四个
- JavaAwtSwing笔记之 Frame和JFrame的区别
- Excel2010无法保存提示检测到错误
- 威眼(WeaView)企业计算机监管系统如何安装客户端和日常使用
- Tower of Hanoi (汉诺塔问题)
- 2018-12-16【训练日记】
- CSS 艺术之暗系魔幻卡牌
- 两个函数相加、相减、相乘等之后的单调性
- iOS App Singer 重签名工具的使用简介
- shell脚本 把十进制数据转换成十六进制