浅谈操作系统中的死锁问题

本文介绍了操作系统中死锁的概念,包括四个必要条件:互斥、请求和保持、不可抢占和循环等待。讨论了处理死锁的预防、避免、检测和解除策略,并通过哲学家进餐问题阐述了如何通过有序分配资源防止死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       何为死锁?死锁是指两个或两个以上的进程在执行过程中,因争夺某一资源而造成的一种互斥等待的现象,若无外力作用,将会一直持续等待下去。此时系统处于死锁状态。最著名的死锁问题有:哲学家进餐问题,如果每一个哲学家因饥饿都拿起了他们左边的筷子,当每一个哲学家又试图去拿起他们右边的筷子时,将会因无筷子可拿而无限期地等待,从而产生死锁问题。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

1.产生死锁的必要条件

       (1)互斥条件。进程对所分配到的资源进行排它性使用,在某一段时间内,某资源只能被一个进程占用。若此时有其它进程请求该资源,则请求进程只能等待,直至占有该资源的进程用毕释放。

       (2)请求和保持条件。进程已经保持至少一个资源,但此时又有新的资源请求,而该资源已被其它进程占有,此时请求进程被阻塞,但对自己获得的资源保持不放。

       (3)不可抢占条件。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放。

       (4)循环等待条件。在发生死锁时,必然存在一个进程资源的循环链,即进程集合{P0,P1,P2,P3.....,Pn}中的P0正在等待一个p1占用的资源,p1正在等待p2占用的资源,......,pn正在等待已被p0占用的资源。

2.处理死锁的方法

      目前处理死锁的方法可归结为以下四种:

        (1)预防死锁。通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防死锁。

        (2)避免死锁。防止系统进入不安全状态时,影响资源动态分配,从而避免发生死锁。

        (3)检测死锁。在进程操作过程中,通过检测机构及时地检测出死锁的发生,采取相应的处理措施,把进程从死锁状态下恢复正常。

         (4)解除死锁。当检测到系统中已发生死锁时,采取相应措施,常用方法是撤消一些进程,回收它们的资源,将它们分配给已堵塞的进程,从而使程序继续进行。

3.下面我将通过哲学家进餐问题来有序分配资源防止死锁。、

      问题描述:有5个哲学家一边思考问题一边用餐交替地进行的生活方式,他们坐在一张圆桌边,桌子上有5个盘子和5只筷子。当一个哲学家思考时,他与邻座的哲学家没有任何联系。当一个哲学家感觉饿了,他就试图拿起他左右两边的筷子用餐;如果他的邻座已经拿到了筷子,则他可能只拿到了一只筷子或者一只也拿不到。当一个饥饿哲学家得到了两只筷子,他就可以用餐,当他用餐完毕,他就会放下筷子继续思考。

      针对问题,设每只筷子为一个信号量,一个哲学家通过在相应信号量上执行P操作抓起一只筷子,通过执行V操作放下已知筷子,5个信号量构成一个数组。

      VAR  chopstick   ARRAY[0,1,2,3,4]  OF  semaphore; //每个信号量初值都为1.

     //哲学家I(1<=i<=5)进程算法:

       Repeat

     //思考;

       P(chopstick[i]);//{拿左筷子}

       P(chopstick[i+1]MOD5);//{拿右筷子}

     //用餐;

       V(chopstick[i]);//{放左筷子}

       V(chopstick[i+1]MOD5);//{放右筷子}

       Until false;

  这种解法虽然可以保证互斥使用筷子,但会产生死锁现象,5个哲学家如果同时抓起各自左边的筷子,此时5个信号量的值都为0,但是当5个哲学家们企图拿起右边的筷子时,便会出现循环等待即死锁。

  为了防止死锁的产生,我们可以采用资源有序分配的方式,规定每个哲学家想用餐时总是先拿编号小的筷子再拿编号大的筷子。当每个哲学家都想用餐时,可能有4个哲学家已经拿到了自己左边的一支筷子,而剩下的第5个哲学家达不到编号小的筷子而等待。其余4个哲学家中有一个人有机会拿起右边的筷子而可以就餐,当他用完餐后放下一双筷子,使得另一个哲学家可以得到右边筷子去用餐,以此类推,其他哲学家们也都先后可以用餐。通过这样处理我们发现不会出现死锁。

改进程序:

      VAR  chopstick   ARRAY[0,1,2,3,4]  OF  semaphore; //每个信号量初值都为1.

     //哲学家I(1<=i<=5)进程算法:

       Repeat

     //思考;

       P(chopstick[1]);//{拿右筷子}

       P(chopstick[5]);//{拿左筷子}

     //用餐;

       V(chopstick[1]);//{放右筷子}

       V(chopstick[5]);//{放左筷子}

       Until false;

4.总结

     死锁是由于进程间相互竞争资源产生的一种阻塞现象。它是一种随机的,不可避免的现象。相信未来人们会开发出更优质地进程调度算法,从而避免和预防死锁的发生。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值