进程互斥和同步

一、进程
  • 进程互斥(mutual exclusion)
  1. 共享资源
  2. 是竞争关系。
  3. 是无意识安排的,可以发生在相关进程之间,也可以发生在无关进程之间。
  4. 是间接制约关系。
  • 进程同步
  1. 合作关系。
  2. 是有意识的安排,只发生在相关进程之间。
  3. 直接制约关系。
二、实现进程互斥
  • 临界区
  1. 系统中某些资源只允许一个进程使用,这样的资源称为临界资源(critical resource),或互斥资源又或共享变量。
  2. 临界区:是指进程中访问临界资源的一段代码。
  • 算法1:单标志
  1. 实质

设置一个变量turn,描述允许进入临界区的进程标识,当turn = i时,进程Pi可进入,当turn = j时,进程Pj可以进入。
2. 缺点
(1)强制两个进程进入临界区,没有考虑进程的实际需要。
(2)未能实现让权等待。

  • 算法2:双标志、先检查
  1. 实质
    flag[]布尔数组,初值设为FLASE,当
    flag[i] = TRUE:Pi在临界区;
    flag[i] = FLASE:Pi不在在临界区。
  2. 优点:不用交替进入
  3. 缺点:未实现让权等待;不能保证互斥使用
  • 算法3:双标志、后检查
  1. 实质
    flag[]布尔数组,初值设为FLASE,当
    flag[i] = TRUE:Pi在临界区;
    flag[i] = FLASE:Pi不在在临界区。
  2. 优点:不用交替进入。
  3. 缺点:未实现让权等待;Pi和Pj可能都不能进入临界区
  • 算法4:先修改,后检查、后修改者等待
  1. 实质
    结合算法1和算法3,设置双标志turn和flag[],再检测。
  2. 优点:体现先到先进,后到等待。
三、进程互斥的硬件实现
  • 硬件指令:
  1. Test-and-Set(TS)指令
  2. Swap指令(Exchange指令)
  • 优点

不仅仅限于两个进程。

  • 缺点
  1. 未实现让权等待。
  2. 可能产生“饥饿”(不公平):一个进程一直得不到资源。
  3. 可能死锁。
四、信号量(Semaphore)与P、V操作
  • 型号量机制
  1. 设置一个地位高于进程的管理者来解决公有资源的使用问题。
  2. Semphore 是一个数据结构
    (1)资源计数(count):
    ①初始化为非负整数。②非负数——当前的空闲资源数。③负值,其绝对值——当前等待临界区的进程数。
    (2)等待队列(Q): 由等待使用资源的进程标识构成。
  • **用信号量和P、V原语实现互斥
  1. P操作:申请资源
    (1)置占用标志
    (2)检查能否进入,如不能,则调用进程进入等待队列,进入等待状态,所以,P(S)可以写成wait(S)
  2. V操作:释放资源
    (1)计数+1
    (2)判断是否有等待进程,唤醒等待进程,V(S)可写成signal(S)。

注意:
(1)P、V原语必须成对出现
(2)P、V原语不能次序错误、不能重复。

五、生产者-消费者问题
  • 问题描述

若干进程通过一共享缓冲池(包含有限的N个缓冲池)交换数据。其中,“生产者”进程不断写入,而“消费者进程”不断读出。任何时刻只能有一个进程可对共享缓冲池进行操作。

注意:具有同步性和互斥性。

  • 实质

  • 过程详解
    在这里插入图片描述
    (1)P(mutex)申请缓冲池的互斥使用权
    (2)V(mutex)释放缓冲池的互斥使用权

注意:操作顺序很重要,不当会发生 死锁 。先执行同步信号量的P操作,再执行互斥型号量的V操作。

六、读者-写者问题
  • 问题描述

对共享资源的读写操作,任意时刻“写者”最多只允许一个,而“读者”则允许多个。
即,读-写互斥,写-写互斥,但是读-读允许。

  • 思路
  1. 作为写者想要进入临界区
    (1)【空闲】无读者、写者:允许进入;
    (2)【占用】一个写者:阻塞;
    (3)【占用】若干读者:阻塞。
    设置mutex,执行P(mutex)操作保证互斥进入。
  2. 作为写者想要退出临界区
    释放临界区资源,只需要执行V(mutex)操作即可释放临界资源,并且唤醒其他等待进程。
  3. 作为读者想要进入临界区
    (1)【空闲】无读者、写者:允许进入;
    (2)【占用】一个写者:阻塞
    (3)【占用】若干读者:允许进入
    首先判断是否是第一个读者,如果是,需要执行P(mutex)操作申请;所以设置Rcount值,只有当Rcount=0,即为第一个读者,需要申请临界资源。无论是不是第一个读者,读者基数都必须+1
  4. 作为读者退出临界区
    (1)若干读者:读者数量-1,不用释放临界区资源;
    (2)作为唯一读者:读者数量-1,同时释放临界资源,进行V(mutex)操作。
    注意:对于Rcount,是多个读者都要进行读写的共享资源,所以,也必须对Rcount进行互斥保护,设置Rmutex互斥信号量,进行相关的PV操作加以保护。
  • 特点
    如果临界区有若干读者,那么再有一个读者要进入临界区,就可以优先于写者进行资源访问,称为读者优先原则。

  • 过程详解

七、哲学家进餐问题
  • 问题描述

要求实现:

  1. 不出现相邻者同时要求进餐
  2. 不出现有人永远拿不到筷子,进而死锁。
  • 实质
  1. 思路:最多允许4个哲学家坐在椅子周围,防止死锁。考虑最坏情况:4个哲学家都拿到一支筷子,剩下最后一支筷子,可以保证至少有一位哲学家可以完成进餐。
  2. 实现:怎样保证最多只有四位哲学家坐在椅子周围呢?可以设置信号量room=4表示可进餐空间或者是椅子数。当哲学家进餐时要先进行P(room)操作,完成进餐后,进行V(room)操作,释放资源。
  3. 执行:
    (1)设置哲学家i(i = 0-4)
    (2)左边筷子:chop[i],右边筷子:chop[i+1]mod5
八、信号量集
  • AND型信号集
    同时申请多个资源。要么全部分配给该进程,要么全部都不分配。
  • 一般信号集
九、管程及其队列结构
  1. 管程 – 把信号量及其操作原语封装在一个对象内部。
  2. 一个软件模块
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值