产生死锁的条件:
1:互斥条件:存在临界资源,互斥的使用之。
2:占有和等待条件:进程在请求资源得不到满足时,不释放已占有资源。
3:不剥夺条件,已占用的资源只能由拥有它的进程释放,不允许其他进程剥夺。
4:循环等待条件:存在循环等待链。每个进程都在链中等待下一个进程所持有的资源,造成永远等待。
前三个条件是死锁存在的必要条件,不是充分条件。第四个条件是前三个的结果。只要破坏四个条件中的一个,就可以防止死锁。
死锁防止策略:
1:破坏互斥条件。
使资源可同时访问而非互斥使用,也就没有进程会阻塞在资源上,而不会发生死锁。
2:破坏占有和等待条件
静态分配可以解决占有和等待条件。静态分配是指进程必须在执行之前就申请所需要的全部资源,直至所有的资源都得到后才开始执行。但这种策略会严重降低资源利用率。
3:破坏不剥夺条件
剥夺调度能够防止死锁,但只是用于主存和处理器资源。方法是占有资源的进程若要申请新的资源,必须主动释放已占用资源。
4:破坏循环等待条件。
采用层次分配策略,将系统中所有资源排列到不同的层次中,一个进程得到某层的一个资源后,只能再申请较高一层的资源。当进程释放某一层的资源时必须先释放所占用的较高层资源。
各种死锁防止算法能够防止发生死锁,但会降低系统的并发性并导致低效的资源利用率。死锁避免却与此相反:如果一个进程当前请求的资源会导致死锁,系统将拒绝启动此进程。如果一个资源分配会导致下一步死锁,系统便拒绝本次分配。
银行家算法是能够避免死锁调度的一种算法。但是它需要在运行前知道所需的资源的最大量,因而缺乏实用价值。
相关链接: