6.5 死锁避免
系统判断分配资源是否安全,并且只能在保证安全的条件下分配资源。
6.5.1 资源轨迹图
当在t点时系统必须做出正确的判断,应该将一部分程序挂起以避免产生死锁
6.5.2 安全状态和不安全状态
- 安全状态
如果没有死锁状态,而且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每个进程运行完毕,则该状态是安全的。
如果线程可以通过仔细的调度避免死锁,所有状态时安全的,
需要区别的是不安全状态并不是死锁状态。
从安全状态出发,系统能够保证所有进程都能完成,而从不安全状态吃饭,就没有这样的保证。
从个人的理解看:
不安全状态有可能进入死锁状态但是不一定进入,是处于安全状态和死锁状态之间的情况。
关键点就是安全状态对所有资源的都突然请求最大资源也是可以科学调度后完成的,不安全状态所有进程同时请求最大资源后是无法完成调度的,但是未必所有资源都会同时产生最大资源请求,而死锁是已经发生了请求资源互斥而休眠的的情况。
6.5.3 单个资源的银行家算法
算法要做的判断是对请求的满足是否会导致进入不安全的状态,如果是则拒绝请求,如果不是则予以分配。
银行家算法就是对每一个请求,进行检测,先执行需要资源最少的进程,完成后资源返回资源池,不断进行直到所有进程都完成或者有无法完成的进程
6.5.4 多个资源的银行家算法
检测一个状态是否安全的算法:
1. 查找仍然需要资源矩阵中年是否有一行,其没有被满足的资源均小于或等于A。如果不存在,那么系统将死锁。
2. 如果找到这样的行,可以假设它所获得的资源并运行结束,该进程标记为终止,并将其资源返还给向量A。
3. 重复以上两步。
实际中很少使用,因为无法判断进程需要多少资源。