从0回顾操作系统---系列三

简介: 死锁与活锁1、什么是死锁?死锁产生的条件?什么是死锁:● 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。● 通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。死锁产生的四个必要条件:(有一个条件不成立,则不会产生死锁)● 互斥条件:一个资源一次只能被一个进程使用;● 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放;● 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺;● 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关

死锁与活锁

1、什么是死锁?死锁产生的条件?

什么是死锁

  • 在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
  • 通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。

死锁产生的四个必要条件(有一个条件不成立,则不会产生死锁)

  • 互斥条件:一个资源一次只能被一个进程使用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放;
  • 不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺;
  • 循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系。

2、如何解决线程死锁?

只要破坏产生死锁的四个条件中的其中一个就可以了

  • 破坏互斥条件 :这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)
  • 破坏请求与保持条件:  一次性申请所有的资源。
  • 破坏不剥夺条件:  占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
  • 破坏循环等待条件:  靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。

3、如何检测死锁?

可以通过检测有向图中是否存在环来检测,从一个节点出发进行 dfs,对访问过的节点进行标记,如果访问到了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。

4、如何解除死锁?

解除死锁的主要方法有:

1. 资源剥夺法:

  • 挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。
  • 但是应防止被挂起的进程长时间得不到资源而饥饿。

2. 撤销进程法(或称终止进程法):

  • 强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。
  • 这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。

3. 进程回退法:

  • 让一个或多个死锁进程回退到足以避免死锁的地步。
  • 要求系统要记录进程的历史信息,设置还原点。

5、举一个死锁的例子?

假设我们有两个线程,分别是线程A和线程B,假设线程A现在持有了锁A,线程B持有了锁B,然后线程A尝试去获取锁B,当然它获取不到,因为线程B还没有释放锁B。然后线程B又来尝试获取锁A,同样线程B也获取不到锁A,因为锁A已经被线程A持有了。这样一来,线程A和线程B就发生了死锁,因为它们都相互持有对方想要的资源,却又不释放自己手中的资源,形成相互等待,而且会一直等待下去。

6、什么是活锁活锁和死锁的区别?

概念:

  • 活锁指的是,两个线程都是处于活跃状态(Runnable),但是呢两个线程分别相互推脱任务,导致线程繁忙,最终程序无法继续向前运行。

活锁和死锁的区别

  • 处于活锁的实体是在不断的改变状态,这就是所谓的“ 活” , 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

解决活锁

  • 为解决活锁可以引入一些随机性,例如如果检测到冲突,那么就暂停随机的一定时间进行重试,这会大大减少碰撞的可能性。

7、什么是饥饿?死锁和饥饿的共同点与区别?

饥饿

  • 由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿。

共同点:

  • 都是进程无法顺利向前推进的现象 (故意设计的死循环除外)

区别:

  • 死锁一定是“循环等待对方手里的资源”导致的,因此如果有死锁现象,那至少有两个或两个以上的进程同时发生死锁。另外,发生死锁的进程一定处于阻塞态。
  • 可能只有一个进程发生饥饿。发生饥饿的进程既可能是阻塞态(如长期得不到需要的I/o设备),也可能是就绪态(长期得不到处理机)
相关文章
|
机器学习/深度学习 人工智能 算法
机器学习笔试面试之图像数据不足时的处理方法、检验方法、不均衡样本集的重采样
机器学习笔试面试之图像数据不足时的处理方法、检验方法、不均衡样本集的重采样
602 0
|
编解码 数据挖掘 开发者
Pandas数据导出:CSV文件
Pandas是Python中强大的数据分析库,提供了灵活的数据结构如DataFrame和Series。通过`to_csv()`函数可轻松将数据保存为CSV文件。本文介绍了基本用法、常见问题(如编码、索引、分隔符等)及解决方案,并涵盖大文件处理和报错解决方法,帮助用户高效导出数据。
1765 83
|
移动开发 前端开发 UED
html5的优点和缺点
【4月更文挑战第9天】html5的优点和缺点
537 1
|
Web App开发 前端开发 测试技术
react18基础教程系列--安装环境及packagejson文件分析
react18基础教程系列--安装环境及packagejson文件分析
|
机器学习/深度学习 并行计算 计算机视觉
CUDA:王者之巅——探究CUDA为何能成为并行计算的佼佼者
本文探讨了CUDA在并行计算领域的崛起及其成为佼佼者的原因,详细介绍了CUDA的技术背景、架构原理及在深度学习、图像处理等领域的应用案例,展示了其显著的性能优势与优化方法,并展望了CUDA在未来计算技术发展中的潜力与方向。
|
编解码 定位技术
12米与30米TanDEM-X数字高程模型DEM数据的下载申请方法
12米与30米TanDEM-X数字高程模型DEM数据的下载申请方法
437 2
|
弹性计算 应用服务中间件 网络安全
ECS服务器使用:SSL证书安装、配置和问题定位指南
本文简要介绍了SSL证书的生成与部署方法,包括使用OpenSSL生成自签名证书和从CA获取证书的步骤,以及在Apache和Nginx服务器上的配置方法。此外,还提供了测试证书是否生效的方法和常见问题的解决策略,帮助确保证书正确安装并解决调试过程中可能遇到的问题。
1548 0
|
开发工具 IDE 开发者
通义灵码安装教程
https://developer.aliyun.com/topic/lingma/activities/202405?taskCode=16245&recordId=c0836910524e8a25109e3abeba50938d#/?utm_content=m_fission_1 「通义灵码推荐官,喊你高效 AI 编码,还有iPhone15、机械键盘、双肩包等福利可领。」
|
负载均衡 Kubernetes 网络协议
阿里雷卷:RSocket从入门到落地,RSocket让AJP换发青春
借助 RSocket 的架构提供,我们可以将之前比较复杂的方案简化,当然最最重要的是性能的提升,即便之前的一些性能提升技术点,可能由于一些约束等,现在和 RSocket 对接,那些问题都不存在啦!这篇文章只是一个架构启发,不会浪费你时间让你学习 20 年前的技术和知识。
18398 98
阿里雷卷:RSocket从入门到落地,RSocket让AJP换发青春
|
算法 Java Apache
Apache Commons
Apache Commons是一个开源项目,提供了一系列的工具和库,用于简化Java开发中的常见任务。
474 1

热门文章

最新文章