在计算机中,各种资源(包括硬件资源和软件资源)都是由操作系统进行管理和分配的。但是如果资源分配不当,就会造成死锁。
死锁定义:系统中存在一组进程(两个或者多个),它们中的每一个进程都占用了某种资源而又都在等待该组进程中另一个进程所占用的资源,从而造成这种等待永远不能结束,则说明系统出现了死锁。如下图所示。
进程A和进程B都要访问资源1和资源2,但是进程A占用资源1,他想要得到进程B占用的资源2才能完成任务,而进程B占用资源2的同时,又想得到进程A释放资源1才能完成任务,在此时,进程A、B都没有完成任务并且占用资源不放,又想得到对方的资源,这就造成了进程的相互等待状态。死锁的形成原因就是这个原理。
死锁形成的原因:各个进程都要访问共享资源,但是共享资源数比进程所需要的资源数要少,系统如果给各个进程分配资源时分配不当,这就会造成死锁。
死锁形成一定同时保持四个必要条件
1、互斥的使用资源——每个资源每次只能给一个进程使用。
2、占有且等待资源——一个进程申请资源得不到满足时处于等待状态,并且不释放自己所占用的资源。
3、非抢夺式分配——任何一个进程不能抢夺另一个进程所占用的资源,即已经被占用的资源只能有占用的进程自己来释放。
4、循环等待资源——存在一组进程,其中每个进程分别等待另一个进程所占用的资源。
这四个条件仅仅是必要条件,而不是充分条件,只要放生死锁,这四个条件一定同时成立,若有一个或多个条件不成立,则一定没有死锁。
死锁的防止
为了避免系统产生死锁,我们可以采取三种方式分配资源避免死锁的发生。
1、静态分配资源:进程在开始执行前就已经申请到自己所需要的全部资源,仅当系统能够满足进程的全部资源申请要求且把资源分配给进程后,进程才开始执行。这样破坏了占有且等待资源,和循环等待资源这两个条件,这样死锁就不存在了。
2、按序分配资源:对系统中每一个资源给出编号,规定任何一个进程申请两个或两个以上的资源时,总是先申请编号小的资源,然后再申请编号大的资源。这里破坏的是循环等待资源。
例如:进程A和进程B都要访问资源1和资源2,访问顺序是先访问资源1,再访资源2,系统将资源1分配给进程A后,进程B不能访问资源2(虽然它需要资源2),他只先访问资源1之后再访问资源2,这样,进程A再使用资源2时就没有进程跟他抢了,能保证进程A完成任务,等进程A完成任务之后,进程B就能访问资源1和资源2了。
3:剥夺式分配资源:当一个进程申请资源得不到满足时,可以从另一个进程那里去抢夺。显然,这种防止死锁的方式就是破坏第三个条件“非抢夺式分配”。这种分配策略目前只是适用于对处理器和主存资源的分配。
小结
从上面的分析看出,死锁的形成原因是各个进程都要访问共享资源并且共享资源数小于进程所需要的资源数造成的。想要破坏死锁,只要破坏死锁形成时同时所保持的四个必要条件就行,因为四个条件必须同时成立才能形成死锁,当有一个或者多个条件不成立时死锁就不会发生,所以,破坏保持死锁的必要条件,就能破坏死锁。