进程死锁
张三拿着语文课本。他学完语文课本后需要数学课本(有人归还数学课本后他才能学数学);
李四拿着数学课本。他学完数学课本后需要语文课本(有人归还语文课本后他才能学语文)。
张三等待李四归还数学课本,李四等待张三归还语文课本。他们等啊等,一直都等不到自己想要的书。因而两个人都永远卡在那里无法前进
定义
有两个进程 A 和 B ,各自在加锁的状态下运行。A 持有一部分资源,并且等待 B 线程中的资源以完成自己的工作,而此时 B 也在等待 A 中的资源以完成自己的工作。由于他们都是锁定状态,所以他们必须完成了自己的工作后,自己持有的资源才能释放。于是进程无休止地等待,导致死锁。
(死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。)
产生死锁的的四个条件
互斥条件:一个资源每次只能被一个进程使用;(语文数学课本只各有一本)
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;(张三没有拿到数学课本前,不会归还语文课本,李四同理)
不剥夺条件:进程已获得的资源,在没使用完之前,不能强行剥夺,只能在使用完时由自己释放;(两个人不能互相抢)
循环等待条件:多个进程之间形成一种互相循环等待资源的关系。(张三等李四,李四等张三)
- 指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
如何破坏死锁?
破坏上述中任一条件即可
- 破坏互斥条件:改造独占性资源为虚拟资源
,但大部分资源已无法改造 - 破坏请求与保持条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源
- 破坏不剥夺条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请
- 破坏循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源
死锁检测与死锁恢复
- 每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。
- 死锁恢复:利用抢占恢复;利用回滚恢复;通过杀死进程恢复。
线程和进程的区别是什么?
- 进程与线程的一个简单解释,以工厂为例(阮一峰),
- 以火车为例,比喻。进程=火车,线程=车厢
- 进程是资源(CPU、内存等)分配的最小单位(如一个工厂),进程是资源分配的最小单位,线程是CPU调度的最小单位(如工厂的工人)
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多
- 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点
- 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间