什么是死锁?算法
若是一个进程集合里面的每一个进程都在等待只能由这个集合中的其余一个进程(包括他自身)才能引起的事件,这种状况就是死锁。ide
这个定义可能有点拗口,下面用一个简单例子说明。
资源A、B,进程C、D描述以下:
资源A和资源B,都是不可剥夺资源,
如今进程C已经申请了资源A,进程D也申请了资源B,
进程C接下来的操做须要用到资源B,而进程D刚好也在申请资源A,
进程C、D都得不到接下来的资源,那么就引起了死锁。
而后套用回去定义:若是一个进程集合里面(进程C和进 程D)的每一个进程(进程C和进程D)都在等待只能由这个集合中的其余一个进程(对于进程C,他在等进程D;对于进程D,他在等进程C)才能引起的事件(释放相应资源)。spa
这里的资源包括了软的资源(代码块)和硬的资源(例如扫描仪)。资源通常能够分两种:可剥夺资源(Preemptable)和不可剥夺资源 (Nonpreemptable)。通常来讲对于由可剥夺资源引发的死锁能够由系统的从新分配资源来解决,因此通常来讲你们说的死锁都是因为不可剥夺资源 所引发的。orm
死锁的四个必要条件进程
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经获得资源的进程能够再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每一个进程都在等待相邻进程正占用的资源。事件
处理死锁的策略资源
1.忽略该问题。例如鸵鸟算法,该算法能够应用在极少发生死锁的的状况下。为何叫鸵鸟算法呢,由于传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟以为看不到危险也就没危险了吧。跟掩耳盗铃有点像。
2.检测死锁而且恢复。
3.仔细地对资源进行动态分配,以免死锁。
4.经过破除死锁四个必要条件之一,来防止死锁产生。it