死锁

死锁


在计算机系统中有很多独占性的资源,在任何一时刻它们只能被一个进程使用。常见的有打印机、磁带以及系统内部中的表项等。正因为如此,操作系统都具有授予一个进程(临时)排他地访问某一种资源的能力。资源可以分为两类:
(1) 可抢占资源(preemptable resource),可以从拥有它的进程中抢占而不会产生任何副作用,例如存储器。
(2) 不可抢占资源(nonpreemptable resource),在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢过来。 死锁和不可抢占资源有关!

下面举一个例子来说明死锁的产生,假设给每一个资源都分配一个信号量,并且这些信号量被初始化为1,当进程请求一个资源时,对该资源的信号量做down操作(信号量减1),当释放资源时又进行up操作(信号量加1)。

//无死锁的编码
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;

void process_A(void){
	down(&resource_1);
	down(&resource_2);
	use_both_resource();
	up(&resource_2);
	up(&resource_1);
}

void process_B(void){
	down(&resource_1);
	down(&resource_2);
	use_both_resource();
	up(&resource_2);
	up(&resource_1);
}

代码说明:其中一个进行先于另一个进程获取资源,这个进程能够成功地获取第二个资源并完成它的任务。如果另一个进程像在第一个资源释放之前获取该资源,那么它由于资源加锁而被阻塞,直到该资源可用为止。

//可能出现死锁的编码
typedef int semaphore;
semaphore resource_1;
semaphore resource_2;

void process_A(void){
	down(&resource_1);
	down(&resource_2);
	use_both_resource();
	up(&resource_2);
	up(&resource_1);
}

void process_B(void){
	down(&resource_2);
	down(&resource_1);
	use_both_resource();
	up(&resource_1);
	up(&resource_2);
}

代码说明:可能出现这样一种情况:进程A获取了资源1,进程B获取了资源2,每个进程如果都想请求另一个资源就会被阻塞,那么每个进程都无法继续运行,这种情况就是死锁。

如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是 死锁(dead lock)。
发生死锁的四个必要条件:
(1) 互斥条件,每个资源要么已经分配给了一个进程,要么就是可用的。
(2) 占有和等待条件,已经得到了某个资源的进程可用再请求新的资源。
(3) 不可抢占条件,已经分配给一个进程的资源不能强制性地被剥夺,它只能被占有它的进程显式地释放。
(4) 环路等待条件,死锁发生时,系统中一定有2个或2个以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。

下面用有向图建立一个简单的死锁模型,圆形表示进程,方形表示资源:



从上面这个图来看,系统中有A到G的7个进程,R到W的6中资源,资源的占有情况和进程对资源的请求情况如下:
(1)A进程持有资源R,且需要资源S;
(2)B进程不持有任何资源,且需要资源T;
(3)C进程不持有任何资源,且需要资源S;
(4)D进程持有资源U,且需要资源S和T;
(5)E进程持有资源T,且需有资源V;
(6)F进程持有资源W,且需要资源S;
(7)G进程持有资源V,且需要资源U。
从资源分配图中可以抽出一个环,该环中进程D、E、G已经死锁。进程A、C、F没有死锁,这是因为资源S可以分配给它们中的任一个,而且它们中的任一进程完成后都能释放资源S,与其他2个进程可依次执行,直至执行完毕。


处理死锁的四种策略:
(1) 鸵鸟算法,假装问题不存在,也许你忽略它,它也会忽略你。
(2) 检测死锁并恢复,即我们不打算阻止死锁的发生,但死锁发生后要采取措施进行恢复。
(3) 仔细对资源进行分配,动态地避免死锁。
(4) 通过破坏引起死锁的四个必要条件之一,防止死锁的产生。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值