操作系统死锁处理方法

什么是死锁

简单来说:多个进程之间各自占有的资源和互相申请的资源形成了环形等待,这种情况下会造成死锁。
1、举例分析

//  生产者
Producer(item) {
P(empty);  // 替换为P(mutex)
P(mutex);  // 替换为P(empty)
...  // 处理共有资源
V(mutex);
V(full); }
// 消费者
Consumer() {
P(full);  // 替换为P(mutex)
P(mutex);  // 替换为P(full)
...  // 处理共有资源
V(mutex);
V(empty); }

上述代码替换后:当生产者任务进入检查empty信号时,恰巧empty等于0,此时生产者任务休眠,等待empty信号量释放唤醒自身。而此时进入消费者任务时,由mutex等于0,消费者任务进入休眠,等待mutex信号量释放唤醒自身。这样一来,生产者和消费者都在等待互相占有的资源来唤醒自身,从而造成了死锁,谁也无法被唤醒。

死锁的处理

1、死锁预防。破坏死锁出现的条件。这要求编程者在编程时充分考虑自身占有资源和释放资源的时序情况,尽量避免因为自身任务出现死锁条件。
2、死锁避免。检测每个资源请求,如果造成死锁就拒绝。使用著名的 银行家算法,检测资源请求,不过该算法耗时较大,一般在要求特殊的地方使用。
3、死锁检测和恢复。检测到死锁出现时,让一些进程回滚,让出资源。该方法太复杂,一般不考虑。
4、死锁忽略。就像没出现死锁一样。发现出现死锁时,重启计算机,恢复原样。使用这种策略的原因主要是发生死锁的概率很小,所以在一般的通用操作系统中Windows、Unix、linux等都采用这一策略。

总结

一般像银行或者军工等要求严格的地方,使用定制的操作系统时其会在系统空闲时做死锁避免。

猜你喜欢

转载自blog.csdn.net/m0_38099380/article/details/88779155