计算机操作系统学习笔记(8)——死锁

简介: 计算机操作系统学习笔记(8)——死锁

一、死锁

多线程为了防止竞争共享资源⽽导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。


当两个线程为了保护两个不同的共享资源⽽使⽤了两个互斥锁,那应⽤不当的时候,可能会造成两个线程都在等待对⽅释放锁,这种情况就是发⽣了死锁。


说白了就是我有你需要的东西,你也有我需要的东西,但是我们2个谁都不肯放手,就导致了死锁


死锁只有同时满⾜以下四个条件才会发⽣:

互斥条件;
持有并等待条件;
不可剥夺条件;
环路等待条件;

互斥条件

互斥条件是指多个线程不能同时使⽤同⼀个资源。

如果线程 A 已经持有的资源,不能再同时被线程 B 持有,如果线程 B 请求获取线程 A 已经占⽤的资源,那线程 B 只能等待,直到线程 A 释放了资源。


持有并等待条件

持有并等待条件是指,当线程 A 已经持有了资源 1,⼜想申请资源 2,⽽资源 2 已经被线程C 持有了,所以线程 A 就会处于等待状态,但是线程 A 在等待资源 2 的同时并不会释放⾃⼰已经持有的资源 1


不可剥夺条件

不可剥夺条件是指,当线程已经持有了资源 ,在⾃⼰使⽤完之前不能被其他线程获取,线程B 如果也想使⽤此资源,则只能在线程 A 使⽤完并释放后才能获取。


环路等待条件

环路等待条件指都是,在死锁发⽣的时候,两个线程获取资源的顺序构成了环形链。


二、避免死锁问题的发⽣

避免死锁问题就只需要四个条件破环其中⼀个条件就可以了

常⻅的并且可⾏的就是使⽤资源有序分配法,来破坏环路等待条件。

什么是资源有序分配法呢?


线程 A 和 线程 B 获取资源的顺序要⼀样,当线程 A 是先尝试获取资源 A,然后尝试获取资源B 的时候,线程 B 同样也是先尝试获取资源A,然后尝试获取资源 B。也就是说,线程 A 和线程 B 总是以相同的顺序申请⾃⼰想要的资源,即破坏了环路等待条件。


三、 互斥锁和⾃旋锁

最底层的两种就是「互斥锁和⾃旋锁」,有很多⾼级的锁都是基于它们实现的


互斥锁加锁失败后,线程会释放 CPU ,给其他线程; ⾃旋锁加锁失败后,线程会忙等待,直到它拿到锁;


对于互斥锁加锁失败⽽阻塞的现象,是由操作系统内核实现的。当加锁失败时,内核会将线程置为「睡眠」状态,等到锁被释放后,内核会在合适的时机唤醒线程,当这个线程成功获取到锁后,于是就可以继续执⾏。


所以,互斥锁加锁失败时,会从⽤户态陷⼊到内核态,让内核帮我们切换线程,虽然简化了使⽤锁的难度,但是存在⼀定的性能开销成本。


那这个开销成本是什么呢?会有两次线程上下⽂切换的成本:


当线程加锁失败时,内核会把线程的状态从「运⾏」状态设置为「睡眠」状态,然后把CPU 切换给其他线程运⾏;接着,当锁被释放时,之前「睡眠」状态的线程会变为「就绪」状态,然后内核会在合适的时间,把 CPU 切换给该线程运⾏。


如果你能确定被锁住的代码执⾏时间很短,就不应该⽤互斥锁,⽽应该选⽤⾃旋锁,否则使⽤互斥锁。


⾃旋锁是通过 CPU 提供的 CAS 函数(Compare And Swap),在「⽤户态」完成加锁和解锁操作,不会主动产⽣线程上下⽂切换,所以相⽐互斥锁来说,会快⼀些,开销也⼩⼀些。


⾃旋锁与互斥锁使⽤层⾯⽐较相似,但实现层⾯上完全不同:当加锁失败时,互斥锁⽤「线程切换」来应对,⾃旋锁则⽤「忙等待」来应对。


目录
相关文章
|
8月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
3月前
|
Android开发 Windows
这是我设想的免重启操作系统的状态下更新通用计算机、嵌入式操作系统的软件设计思路
本方案提出了一种名为slfm的软件系统,旨在实现通用计算机及嵌入式系统在不重启状态下完成操作系统更新。其核心机制是通过构建独立于原系统的运行环境(slfm Recovery与The Tube),在高权限模式下进行系统文件更新与切换,确保更新过程中设备持续运行,适用于普通设备与不可中断服务的关键系统(如医疗、服务器等)。同时具备失败回滚、数据同步、权限隔离等功能,提升系统更新的安全性与可用性。
|
算法 安全
操作系统中的死锁
【8月更文挑战第23天】
223 0
|
11月前
|
存储 安全 固态存储
计算机启动:从插上电源到操作系统启动的全过程
当我们插上电源,计算机从休眠状态苏醒,直至操作系统完全启动,这一系列复杂的过程涉及到硬件和软件的多个层面。本文将详细解析计算机插上电源后操作系统所做的工作,揭示这一过程的技术细节。
507 6
|
存储 算法 网络协议
了解操作系统的基本原理和常见操作,提高计算机使用效率
了解操作系统的基本原理和常见操作,提高计算机使用效率
225 4
|
运维 安全 Linux
计算机架构“寒武纪爆发”,操作系统进化迸发中国浪潮
计算机架构“寒武纪爆发”,操作系统进化迸发中国浪潮
|
程序员 数据库
深入剖析操作系统死锁:不可不知的四大条件!
大家好,我是小米。今天探讨操作系统中的死锁问题——两个或更多进程因争夺资源陷入相互等待的状态。死锁有四个必要条件:互斥、请求与保持、非剥夺及循环等待。解决策略包括:使用乐观锁破坏互斥条件;资源一次性分配避免请求与保持;允许资源剥夺;以及采用资源有序分配法消除循环等待。通过这些方法,可以有效预防和解决死锁,提升系统稳定性和效率。希望本文能帮助你更好地理解并处理死锁问题!
393 4
|
算法 安全 调度
操作系统中的死锁、饥饿和优先级反转
【8月更文挑战第23天】
515 0
|
安全 算法 C++
操作系统---死锁相关
操作系统---死锁相关
185 0
|
Linux 调度
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间

热门文章

最新文章

推荐镜像

更多