死锁的概念
一组进程中,每个进程都无限等待被改组进程中另一个进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。
如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。
需要注意:
- 参与死锁的所有进程都在等待资源
- 参与死锁的进程是当前系统中所有进程的子集
死锁出现的原因:
1.资源数量有限、锁和信号量错误使用
1.1 资源的使用方式: “申请-分配-使用-释放”模式
- 可重用资源:可被多个进程多次使用:
- 可抢占资源和不可抢占资源
- 例如:处理器、I/O部件、内存、文件、数据库、信号量
- 可消耗资源:只可使用一次,可创建和销毁的资源
- 例如:信号、中断、消息
1.2 进程竞争可重用资源
例子1:
其中 T:磁盘设备;D: 磁带设备;
进程Q申请到了磁带设备再等待磁盘文件,而P申请到了磁盘文件,等待磁带设备。两个互相等待就出现了死锁现象。
例子2:
其中现在系统可分配内存为200KB
如果P1申请到80KB,P2申请到70KB,他们要接着申请剩余需要的资源,都申请不到 ,均要等待,会出现死锁现象。
1.3 进程竞争可消耗资源
活锁和饥饿:
// 应用Peterson算法
void process_A
{
enter_region(&resource_1); //获取资源的使用权
enter_region(&resource_2);
use_both_resource();
leave_region(&resource_2);
leave_region(&resource_1);
}
void process_B
{
enter_region(&resource_2);
enter_region(&resource_1);
use_both_resource();
leave_region(&resource_1);
leave_region(&resource_2);
}
活锁现象:
- 先加锁;
- 再轮询;
- ——>即无进展也没有阻塞
饥饿:
资源分配策略决定的
产生死锁的四个必要条件:
互斥使用(资源独占):
一个资源每次只能给一个进程使用占有且等待(请求和保持,部分分配):
进程在申请新的资源的同时保持对原有资源的占有不可抢占(不可剥夺):
资源的申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者资源释放循环等待:
存在一个进程等待队列{P1,P2,P3,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程的等待环路