操作系统中的互斥,同步与死锁

当年操作系统学的那叫一个渣……现在基本从头捡起

1.相关术语

并发——在同一时间间隔内发生的进程或线程,在此期间,它们可能交替地共享相同的资源

原子操作(atomic operation)——不可分割

临界资源——不可共享的资源
临界区(critical section)——不允许多个进程同时进入的一段访问共享资源的代码
死锁(deadlock)——两个及以上进程,因每个进程都在等待其他进程做完某事(如释放资源),而不能继续执行
活锁(livelock)——两个及以上进程,为响应其他进程中的变化,而不断改变自己的状态,但是没有做任何有用的工作
互斥(mutual exclusion)——当一个进程在临界区访问共享资源时,不允许其他进程进入访问
竞争条件(race condition)——多个进程/线程读写共享数据,其结果依赖于它们执行的相对时间
饥饿(starvation)——可运行的进程长期未被调度执行

2、互斥

(1)互斥的要求:

强制排他(一个进程进入临界区后不允许其他进程进入)

充分并发(任何不在临界区停止的进程不干涉其他进程)

有限等待(决不允许出现一个需要访问临界区的进程被无限延迟)

空闲让进(没有进程在临界区中时,任何需要访问临界区的进程必须能够立即进入)

满足异步(相关进程的执行速度和处理机数目没有任何要求或限制)

让权等待(当进程不能进入临界区,应该立即释放处理机,防止进程忙等待)

(2)实现互斥的方法

软件方法:Dekker算法,Peterson算法
硬件方法:TestSet指令,Exchange指令
OS或程序设计语言的支持:信号量,管程,消息机制

3、同步

这里只想说下同步的概念,上课一直不太理解。找到了一篇博文,博主对同步做了很详细的解释。我的理解如下:

同步就是两个及两个以上的操作就有严格是先后顺序,其中任何一个操作依赖于另外的一个或几个操作,例如课上的例子乘务员和司机,司机是否开车依赖于乘务员是否关车门。而异步是指,几个不同的操作之间没有绝对的依赖关系。

4、死锁

(1)  死锁的原因
           一组互相竞争系统资源或者是进行通信的进程间的永久阻塞。当进程都在等待某一个事件(典型的是等待所请求资源的释放),而只有在这组进程中其他也被阻塞的进程才可以触发该事件,这组进程发生了死锁。
           进程竞争的资源分为两种,一种是可以重用性的资源,一种是可消耗的资源。可以重用的资源一次只能够提供给一个进程使用,而且不会因为使用而耗尽资源,进程使用完资源的时候,释放资源,其他的进程可以再次使用,比如  CPU 处理器, IO  内存,外存,信号量数据库等等。
           可消耗的资源:比如中断、信号、消息、  IO 缓冲区域。
     死锁的充要条件:
互斥:一个资源只能够供一个进程使用,已分配给进程的资源,不可以在分配给其他的进程;
占有且等待:当进程等待其他进程释放资源的时候,他申请的并且已经获得的资源是继续占有已经获得的资源的;
不可抢占:不可以抢占进程已经占有的资源;
循环等待:存在一个封闭的进程链,是每一个进程至少占有此链中下一个进程所需要的一个资源。
           没有一个可以解决所有类型死锁的有效策略,对于死锁我们只能够预防、避免和检测。
死锁预防:是一种比较保守的方法,一次性请求所有资源、抢占、以线性顺序申请资源等,但是这些方式有着不同的缺点,比如:以线性顺序申请资源,就不允许增加对之前申请过的资源的请求。一次性请求所有的资源的话,就会造成资源的利用率比较低,而且事先必须知道对所有资源的请求情况,延迟了进程的初始化。
           死锁避免:处于检测和预防的之间的方法,对于每分配一个资源,操作系统必须能够执行至少一个进程,否则不会分配资源的。但是缺点十分明显,就是必须知道将来资源的请求情况。
           死锁检测:非常自由的分配资源。只要有可能,请求的资源都会被允许,通过周期性的检测当前的所有的进程中之间是否存在死锁,不会延迟进程的初始化,但是当检测到死锁情况发生的时候,可能需要抢占该进程的资源,让该线程终止。
  不管哪种方法,都需要破坏死锁的至少一个条件才能破解僵局。
(2)  死锁的预防
互斥:   不可以禁止,操作系统必须支持互斥;
占有且等待:预防占有且等待,可以一次请求该进程的所有资源,并且阻塞该进程直到所有请求都被满足;
不可以抢占:必须保存当前的处理器的状态,才可以将阻塞的进程占有的资源释放掉,供其他的进程请求。两种方法:第一种是如果占有某些资源的一个进程进一步申请资源时被拒绝,那它释放它占有的资源;第二种是如果一个进程请求当前被另一个进程占有的资源,则操作系统可以抢占另一个进程,要求它释放资源,适用于两个进程优先级不同的情况
循环等待:将所有的资源请求进行排序,这样就不会出现进程之间的循环等待,但是禁止了进程在次申请之前的已经申请的资源。
(3) 死锁的避免
死锁预防通过防止三个必要条件中的一个,防止出现循环等待的情况,这种方法比较低效,而且不太实用。死锁避免则相反,他是允许三个必要条件,但是不允许出现循环等待的状况,这样会允许处理更多的并发请求。死锁避免需要知道将来的进程资源需求的情况。
在死锁的避免中,是否同意资源的请求是通过判断该请求是否可能造成死锁来决定的。如果一个进程的启动会造成死锁的话,则不启动该进程;如果一个进程增加资源请求的话,会造成死锁,则不分配给他资源。
           有银行家算法(资源分配拒绝策略)和拒绝启动进程的算法。
           首先是拒绝启动的算法:
         R  表示系统资源,  V  表示未分配的资源, C[i][j] 表示进程  i 对资源 j  的需求,  A[i][j] 表示的是进程 i 中已经分配了资源  j 的数目。根据这个矩阵的关系,定义了一个死锁避免的策略:如果一个新进程的资源需求会导致死锁,则拒绝启动这个新的进程。
         Rj >= C(n+1)j + sum(Cj)
           银行家算法:
           就是一系列的进程已经运行,  R 表示总的资源数目, V 表示当前未分配的资源,  C 表示需求的资源, A 表示当前已经给进程分配的资源,那么  C-A 矩阵就是新的资源分配需求,  V 需要满足至少一条 C-A ,否则不会分配资源给进程。然后再可以执行的进程结束的时候,回收掉该进程的所有资源。
(4) 死锁的检测
           检测死锁的情况,  Allocation 矩阵表示的是已经分配的资源,  Q 表示进程请求的资源, R 表示资源的总数目,  Available 表示当前可用的资源。
           首先将 Allocation 中的  0 行标记,然后是在 Q 中找到一行可以让  Available 满足,如果找到,则将 Allocation 对应的行加到  Available 中,继续该过程,知道找不到为止,如果出现了没有标记的进程,那么他们就是死锁的进程,需要处理。
           万一系统中出现死锁的状况,就需要以某种策略恢复死锁:
           取消所有的死锁进程,一般是是操作系统会这样做;回滚到前面有效的检查点,重新启动所有进程,但是死锁可能再次发生;连续取消死锁进程,知道不在出现死锁为止,这个时候需要重启死锁检测算法。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值