OS复习笔记ch6-1

死锁的原理

定义

一组进程中,其中每个进程因等待事件而阻塞,且所等待的事件只能被这组进程中的另一阻塞进程激发称之为死锁。

举例如下

四个车辆希望紧迫的希望能很快通过,每辆车需要两个象限的资源,然而四个车都只得到一个象限的资源,每辆车都过不去,此时就会发生阻塞。

死锁的原因

并发进程的资源竞争
  • 资源数目不足
  • 资源分配策略,如动态分配
  • 进程对资源使用要互斥访问

有关资源的竞争,比如上图中四辆车过交叉路口、著名的哲学家就餐问题,还有在之前的章节中,我们讲解互斥和同步的时候也举了很多由于资源竞争的例子,这里不再赘述。

并发进程执行的顺序

这里举了一个双进程的例子,理解执行顺序对死锁的影响

有两个进程P、Q需要互斥地访问A、B一段时间,各自的伪代码如右图所示


下图是进程访问图示(图中总共有6种路线,中间的/和\区域需要互斥访问)

  • 1、2号线,表示Q进程先拿到了A和B的资源,P进程拿不到,只能等到Q进程释放资源。同理,对于5、6号线路P进程先拿到资源,然后是Q进程等待,不会引发死锁。

  • 3、4号线路是死锁不可避免,两者只是顺序不同,所以我们就只看其中一条线路即可。3号线路中,其中P拥有A,Q拥有B。由于不能走到互斥访问区域,所以接下来不管怎么走,P和Q两个都会走到死锁区域的边界点,即图中的(GetB,GetA)。

解决方案

此时,可以通过修改P进程的代码实现互斥,将Get B和release A交换顺序,可以避免死锁

这样资源的访问图如下

两者的不可访问区域没有重叠,进程对资源的获得有隙可乘,就可以实现互斥访问了

资源分类

  • 可重用资源的死锁:内存,信号量等
  • 可消耗资源:中断信号、message(消息)、I/O缓冲区

资源分配图

箭头表示资源的供给关系,左图P1需要Ra资源,右图P1占有Ra资源

图c是资源数目不够,然后形成了回路,相互得不到资源。

而图d是资源数目充足,虽然表面是回路,但是下一时刻资源可以分配,也就没有死锁。

死锁的条件

  • Mutual exclusion 互斥
    任一时刻只允许一个进程使用资源
  • Hold-and-wait 保持和请求
    进程在请求其余资源时,不主动释放已经占用的资源
  • No preemption 不可剥夺
    进程已经占用的资源,不会被强制剥夺
  • Circular wait 循环等待
    资源分配图不能化简,存在一个进程之间的封闭环路。(注意:循环等待不一定导致死锁,但是死锁一定有循环等待)

这四个条件都是必要条件,只不过一般情况下,根据循环等待判断死锁,往往比较有充分性。

相关推荐
小宇子2B1 天前
三、内核入口 el0_svc / entry_SYSCALL_64 的汇编做了什么——从异常向量到 C 函数
操作系统
小宇子2B2 天前
四、从 write(1, "hello", 5) 到 ksys_write() —— sys_call_table 怎么路由的
操作系统
小宇子2B2 天前
一、printf("hello") 怎么变成 write(1, "hello", 5) —— libc 的 stdout 缓冲机制
操作系统
小宇子2B7 天前
一个 pthread_mutex_lock() 到底锁了什么——从用户态 CAS 到内核调度
操作系统
LinXunFeng8 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
小宇子2B8 天前
多线程 malloc 为什么会变慢——glibc 的 arena 到 bins 全景
操作系统
闪闪发亮的小星星12 天前
高斯光以及高斯光公式解释
笔记
cqbzcsq12 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
阿米亚波12 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
自传.12 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding