操作系统复习 1.并发和死锁

操作系统复习  1. 并发和死锁  20131019
前言:
           TP 面试的时候问到了操作系统中的死锁问题,还有就是在  YY 遇到的进程同步问题,这些是在操作系统的两部分内容,之前没有复习,吃点亏,现在补回来。
1.  死锁的原因
           一组互相竞争系统资源或者是进行通信的进程间的永久阻塞。当进程都在等待某一个事件(典型的是等待所请求资源的释放),而只有在这组进程中其他也被阻塞的进程才可以触发该事件,这组进程发生了死锁。
           进程竞争的资源分为两种一种是可以重用性的资源,一种是可消耗的资源。可以重用的资源一次只能够提供给一个进程使用,而且不会因为使用而耗尽资源,进程使用完资源的时候,释放资源,其他的进程可以再次使用,比如  CPU 处理器, IO  内存,外存,信号量数据库等等。
           可消耗的资源:比如中断、信号、消息、  IO 缓冲区域。
           没有一个可以解决所有类型死锁的有效策略,对于死锁我们只能够预防、避免和检测。
           死锁预防:是一种比较保守的方法,预先提交资源,一次性请求所有资源、抢占、资源排序等等,但是这些方式有着不同的缺点,比如:资源排序,就不允许增加对之前申请过的资源的请求。一次性请求所有的资源的话,就会造成资源的利用率比较低,而且实现必须知道对所有资源的请求情况,延迟了进程的初始化。
           死锁避免:处于检测和预防的之间的方法,对于没分配一个资源,操作系统必须能够执行至少一个进程,否则不会分配资源的。但是缺点十分明显,就是必须知道将来资源的请求情况。
           死锁检测:非常自由的分配资源只要有可能,请求的资源都会被允许,通过周期性的检测当前的所有的进程中之间是否存在死锁,不会延迟进程的初始化,但是当检测到死锁情况发生的时候,可能需要抢占该进程的资源,让该线程终止。
 
           死锁发生的条件:
           互斥:一个资源只能够供一个进程使用,已分配给进程的资源,不可以在分配给其他的进程;占有且等待:当进程等待其他进程释放资源的时候,他申请的并且已经获得的资源是继续占有已经获得的资源的;不可抢占:不可以抢占进程已经占有的资源;循环等待:存在一个封闭的进程链,是每一个进程至少占有此链中下一个进程所需要的一个资源。
           对于死锁的情况,我们从条件上加以破除,就不会产生死锁了。
 
2.  死锁的预防
           互斥:  不可以禁止,因为如果需要对资源进行互斥的访问,操作系统必须支持互斥;
           占有且等待:预防占有且等待,可以一次请求该进程的所有资源,并且阻塞该进程,如果没有满足请求道所有的资源;
           不可以抢占:必须保存当前的处理器的状态,才可以将阻塞的进程占有的资源释放掉,供其他的进程请求。
           循环等待:将所有的资源请求进行排序,这样就不会出现进程之间的循环等待,但是禁止了进程在次申请之前的已经申请的资源。
3.  死锁的避免
           死锁预防通过防止三个必要条件中的一个,防止出现循环等待的情况,这种方法比较低效,而且不太实用。死锁避免则相反,他是允许三个必要条件,但是不允许出现循环等待的状况,这样会允许处理更多的并发请求。
           在死锁的避免中,是否同意资源的请求是通过判断该请求是否可能造成死锁来决定的。如果一个进程的启动会造成死锁的话,则不启动该进程;如果一个进程增加资源请求的话,会造成死锁,则不分配给他资源。
           有银行家算法(拒绝在分配资源)和拒绝启动进程的算法。
           首先是拒绝启动的算法:
         R  表示系统资源,  V  表示未分配的资源, C[i][j] 表示进程  i 对资源 j  的需求,  A[i][j] 表示的是进程 i 中已经分配了资源  j 的数目。根据这个矩阵的关系,定义了一个死锁避免的策略:如果一个新进程的资源需求会导致死锁,则拒绝启动这个新的进程。
         R >= Cn+1 + sum(Ci)
           银行家算法:
           就是一系列的进程已经运行,  R 表示总的资源数目, V 表示当前未分配的资源,  C 表示需求的资源, A 表示当前已经给进程分配的资源,那么  C-A 矩阵就是新的资源分配需求,  V 需要满足至少一条 C-A ,否则不会分配资源给进程。然后再可以执行的进程结束的时候,回收掉该进程的所有资源。
4.  死锁的检测
           检测死锁的情况,  Allocation 矩阵表示的是已经分配的资源,  Q 表示进程请求的资源, R 表示资源的总数目,  Available 表示当前可用的资源。
           首先将 Allocation 中的  0 行标记,然后是在 Q 中找到一行可以让  Available 满足,如果找到,则将 Allocation 对应的行加到  Available 中,继续该过程,知道找不到为止,如果出现了没有标记的进程,那么他们就是死锁的进程,需要处理。
           万一系统中出现死锁的状况,就需要以某种策略恢复死锁:
           取消所有的死锁进程,一般是是操作系统会这样做;回滚到前面有效的检查点,重新启动所有进程,但是死锁可能再次发生;连续取消死锁进程,知道不在出现死锁为止,这个时候需要重启死锁检测算法。
 
3.  哲学家就餐问题
           使用的是信号量解决:美味哲学家都坐下来拿左边的叉子,拿到的话,再去那右边的叉子。这样规定了一个拿叉子的顺序,就可以吃到饭了:
         semaphore fork[5] = {1};
         void philosopher(int i){
                   while(true){
                            think();
                            wait(fork[i]);     
                            wait(fork[(i+1)%5]);
                            eat();
                            signal(fork[i+1]);
                            signal(fork[i]);
                   }
         }        
或者是只允许数目四个科学家进入就餐,这样至少一位可以拿到两把叉子。
4.Linux  中的管道机制、消息、共享内存、信号量

转载于:https://www.cnblogs.com/hbhzsysutengfei/p/3439339.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值