一、进程的死锁问题
-
在计算机系统中有各种互斥资源(如磁带机、打印机和绘图仪等)和软件资源(如进程表、临界区等),若两个进程互相要求对方已占用的资源,或同时进入临界区则会出现问题
-
所谓死锁,是指两个以上的进程互相都要求使用对方已经占有的资源而导致无法继续运行的现象
(一)死锁问题的产生
进程管理是操作系统的核心,设计不当就会出现死锁问题
进程推进顺序不当、同类资源分配不当、PV操作使用不当等情况都可能造成死锁
如果一个进程在等待一件不可能发生的事,则进程就死锁了
而如果一个或多个进程产生死锁,就会造成系统死锁
(二)死锁举例
1、例:进程推进顺序不当引起的死锁。设系统中有一台读卡机A,一台打印机B,它们被进程P1和P2共享,进程P1和P2并发执行时按下列顺序请求和释放资源
假如按P1<a>P2<a>P1<b>P2<b>的次序执行,则系统发生死锁
因为进程P1执行Request(A)时,由于读卡机未被占用,所有请求可以得到满足;进程P2执行Request(B)时,由于打印机未被占用,所以请求也可以得到满足;接着进程P1执行Request(B)时,由于打印机被占用,所有请求得不到满足,P1等待;进程P2执行Request(A)时,由于读卡机被占用,所以请求得不到满足,P2也等待。此时,双方都在请求对方已占有的资源,系统发生死锁。
2、例:系统有A、B和C三个进程,每个进程都需要4个系统资源才能运行完成,要求无论怎么分配资源都不会发生死锁问题,那么系统至少要有多少个资源?
![](https://i-blog.csdnimg.cn/blog_migrate/e8ed23ec89df04f9ca72c1ee5b6a0492.png)
(三)产生死锁的原因、条件、后果
1、产生死锁的原因
产生死锁的原因是竞争资源或非法的进程推进顺序
当系统中有多个进程共享的资源不足以同时满足它们的需求时,引起这些进程对资源的竞争导致死锁
由于非法的进程推进顺序,进程在运行过程中,请求和释放资源的顺序不当,导致进程死锁
2、产生死锁的4个必要条件:互斥条件、请求保持条件、不可剥夺条件和环路条件
互斥条件:一次只允许一个进程使用
请求保持条件:零星的请求资源,没有一次性得到足够的资源,即已获得部分资源又请求资源被阻塞
不可剥夺条件:进程已获得的资源在未使用完之前不能被剥夺,只能在使用完时由自己释放
环路等待条件:当发生死锁时,在进程资源有向图中必然构成环路,其中每个进程占有了下一个进程申请的一个或多个资源
如图所示,其中方框表示资源,圆圈表示进程
请求资源:箭头由进程指向资源
分配资源:箭头由资源指向进程
3、死锁的后果
-
如果一个进程在等待一件不可能发生的事,则进程就死锁了;而如果一个或多个进程产生死锁,就会造成系统死锁
(四)死锁的预防:打破四大条件
打破互斥资源:共享资源
打破保持和等待:进程主动释放资源
打破不可剥夺:系统剥夺其他已分配资源
打破环路等待:使其不构成环路
(五)死锁的避免方法
-
有序资源分配法:资源轮流分配,进程依次执行(资源利用率低)
-
银行家算法:按照一定的原则进行资源分配(更加灵活)
二、银行家算法
(一)银行家算法:资源分配原则
当一个进程对资源的最大需求量不超过系统中剩余资源数时,可以将资源分配给此进程,使其能够正常运行
进程可以分批请求资源,但请求的总数不能超过此进程的最大需求量
当系统现有的资源不能满足进程尚需资源数时,对进程的资源请求可以推迟分配,但总能使进程在有限时间内得到所需资源
(二)案例
求剩下的资源数量:R1 = 9 - (1+2+2+1+1) = 2,R2 = 8 - (2+1+1+2+1) = 1,R3 = 5 - (1+1+0+0+3) = 0
- 进程运行完成后释放它所占用的资源
三、线程
(一)传统的进程
传统的进程有两个基本属性:可拥有资源的独立单位,可独立调度和分配的基本单位
由于在进程的创建、撤销和切换中,系统必须为之付出较大的空间开销,因此在系统中设置的进程数目不宜过多,进程切换的频率不宜太高,这就需要指令并发程度的提高
(二)线程
引入线程后,将传统进程的两个基本属性分开,线程是进程中的一个实体,线程作为调度和分配的基本单位,进程作为独立分配资源的单位
用户可以通过创建线程来完成任务,以减少程序并发执行时付出的空间开销
线程基本上不拥有资源,只拥有一点运行中必不可少的资源(如程序计数器、一组寄存器和栈),它可与同一个进程的其他线程共享进程所拥有的全部资源
线程可创建另一个线程,同一个进程中的多个线程可并发执行。线程也具有就绪、运行和阻塞三种基本状态。由于线程具有许多传统进程所具有的特性,故称为“轻型进程”(Light-Weight Process);传统进程称为“重型进程”(Heavy-Weight Process)
例如:在文件服务进程中,可设置多个服务线程,当一个线程受阻时,第二个线程可以继续运行,当第二个线程受阻时,第三个线程可以继续运行……从而显著地提高了文件系统地服务质量及系统地吞吐量