一、前言
死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁今天来给大家用一个案例来分析,希望能够对想了解死锁的朋友有所帮助。
二、死锁的基本概念
1.概念:多个并发进程因争夺系统资源而产生相互等待的现象。
2.原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
本质原因:
1)系统资源有限。
2)进程推进顺序不合理。
3.死锁产生的4个必要条件
1、互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
2、占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
3、不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
4、循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
4.破坏死锁的方法
原理:破坏以上四个条件之一,即可。
三、银行家算法实现
银行家算法中的数据结构
为了实现银行家算法,必须设置以下四个数据结构:
(1)可利用资源向量Available:其初始值是系统中所配置的该类全部可用资源的数目。
(2)最大需求矩阵Max:它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
(3)分配矩阵Allocation:它定义了系统中每一类资源当前已分配给每一个进程的资源数。
(4)需求矩阵Need:用一表示每一个进程尚需的各类资源数。
1.安全性算法
(1)初始化安全序列为空
(2)从Need中寻找符合要求的进程请求,并将其加入安全序列
(3)该步骤(2)如出现无法寻找,并且安全序列并未满,则不安全,反之安全。若步骤(2)能够能够找到一个安全的进程请求,则加入安全序列,继续扫描,并设立一个flag标志表示还可以进行下一波扫描
2.银行家算法
Request(i)是进程P(i)的请求向量。如果Requst(i)[j]=K,表示进程P(i)需要K个R(j)类型的资源。
(1)如果Request(i)[j]=Need[i,j],便转向步骤2,否则出错;
(2)如果Request(i)[j]=Available[j],便转向步骤3,否则出错;
(3)系统试探着把资源分配给进程P,并修改下面数据结构中的数值:
Available[j]=Avaliable[j]-Request(i)[j];
Allocation[i,j]=Allocation[i,j]+Request(i)[j];
Need[i,j]=Need[i,j]-Request(i)[j];
(4)执行**安全性算法*,检查此次资源分配后系统是否处于安全状态*。安全则分配,否则分配作废
3.代码实现
作为一个合格的程序员,必然会涉及到进行代码的规范以及对性能的调优,而调优主要是除了负载均衡、缓存优化、数据库优化(例如建立索引)非代码层面外,还要代码层面的调用,那必须做到对OS比较熟悉,尽量少写烂代码,合理调用OS提供的库函数以及计算机所提供的CPU、内存等重要资源。