其他
写给大忙人看的死锁详解
The following article is from Java建设者 Author cxuan
资源
可抢占资源和不可抢占资源
资源获取
这里说一下什么是互斥锁(Mutexes): 在计算机程序中,互斥对象(mutex) 是一个程序对象,它允许多个程序共享同一资源,例如文件访问权限,但并不是同时访问。需要锁定资源的线程都必须在使用资源时将互斥锁与其他线程绑定(进行加锁)。当不再需要数据或线程结束时,互斥锁设置为解锁。
semaphore aResource;
void processA(void){
down(&aResource);
useResource();
up(&aResource);
}
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useAResource();
useBResource();
up(&aResource);
up(&bResource);
}
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
void processB(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
semaphore aResource;
semaphore bResource;
void processA(void){
down(&aResource);
down(&bResource);
useBothResource();
up(&bResource);
up(&aResource);
}
void processB(void){
down(&bResource); // 变化的代码
down(&aResource); // 变化的代码
useBothResource();
up(&aResource); // 变化的代码
up(&bResource); // 变化的代码
}
死锁
资源死锁的条件
互斥条件:每个资源都被分配给了一个进程或者资源是可用的 保持和等待条件:已经获取资源的进程被认为能够获取新的资源 不可抢占条件:分配给一个进程的资源不能强制的从其他进程抢占资源,它只能由占有它的进程显示释放 循环等待:死锁发生时,系统中一定有两个或者两个以上的进程组成一个循环,循环中的每个进程都在等待下一个进程释放的资源。
死锁模型
圆形表示进程 方形表示资源
这里需要注意一个问题,为什么从资源出来的有向图指向了进程却表示进程请求资源呢?笔者刚开始看也有这个疑问,但是想了一下这个意思解释为进程占用资源比较合适,而进程的有向图指向资源表示进程被阻塞的意思。
忽略死锁带来的影响(惊呆了) 检测死锁并回复死锁,死锁发生时对其进行检测,一旦发生死锁后,采取行动解决问题 通过仔细分配资源来避免死锁 通过破坏死锁产生的四个条件之一来避免死锁
鸵鸟算法
死锁检测和恢复
每种类型一个资源的死锁检测方式
每种类型多个资源的死锁检测方式
每当有资源请求时就去检测,这种方式会占用昂贵的 CPU 时间。 每隔 k 分钟检测一次,或者当 CPU 使用率降低到某个标准下去检测。考虑到 CPU 效率的原因,如果死锁进程达到一定数量,就没有多少进程可以运行,所以 CPU 会经常空闲。
从死锁中恢复
通过抢占进行恢复
通过回滚进行恢复
杀死进程恢复
死锁避免
单个资源的银行家算法
这里注意一点:不安全状态并不一定引起死锁,由于客户不一定需要其最大的贷款额度,但是银行家不敢抱着这种侥幸心理。
破坏死锁
互斥 保持和等待 不可抢占 循环等待
破坏互斥条件
破坏保持等待的条件
破坏不可抢占条件
破坏循环等待条件
其他问题
两阶段加锁
通信死锁
活锁
饥饿
总结
尾声
提出一个勘误,已反馈给出版社更多精彩推荐
☞他被称为"中国第一程序员",一人之力单挑微软,如今拜入武当修道
☞罗永浩回应被中消协点名;传前淘宝直播运营负责人因贪污被阿里通报;TypeScript 4.0 Beta发布 | 极客头条
☞汉芯一号、木兰语言再到天赐OS,国产基础软件十年泣血,梦想何圆?