本文主要是介绍操作系统【OS】Ch2 进程同步与互斥机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
进程同步与互斥机制1:硬件和软件方法
硬件方法
中断屏蔽 | - 使用开/关中断指令实现
- 简单高效
- 只适用于单处理机
- 只适用于操作系统内核进程【因为关中断的权力不能交给用户】
|
TestAndSet |  |
Swap |  |
软件方法
单标志法 |  |  比如:1运行完了之后让2运行,2不想运行,此时turn一直是1,不会到0,故1想运行也运行不了 |
双标志先检查 |  |  - 可能同时进入临界区
- eg:一开始没有进程在运行,则,1和2都想进入的时候,就一起进入了
|
双标志后检查 |  |  - eg:两个都把标志设为true,两个都卡在了while
|
Peterson算法 |  |  |
进程同步与互斥机制2:管程
定义 | - 用于解决信号量机制麻烦、易出错、大量同步操作分散的问题
- 管程定义了共享数据结构和各种进程在该数据结构上的全部操作
- 管程支持进程互斥【互斥的特性是由编译器负责的】;
- 任何时候只有一个进程在管程中执行
- 管程不仅能实现进程间的互斥,还能实现进程间的同步
- Java 采用管程机制
- Java中管程常见的代码:synchronized关键字,wait()、notify()、notifyAll()
- 管程是被进程调用的,管程是语法范围,无法创建和撤销
|
组成 | PS:这类题目如果看到是管程外这个字眼,那就是错误的,管程的组成都是基于管程内部的 - 管程的名字
- 局部于管程内部的共享数据结构或者共享变量说明
- 对管程内的数据结构进行操作的一组过程
- 对局部于管程内部的共享数据设置初始值的语句
|
特点 | - 局部于管程的数据只能被局部于管程的过程所访问
- 一个进程只能通过调用管程内的过程才能进入管程访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
|
管程中设置的条件变量 | 定义 | | 有两种操作 | - x.wait:阻塞进程,将其插入到阻塞队列中
- x.signal:唤醒进程,将其插入到就绪队列中
| 与信号量的相似点 | - wait/signal类似于信号量的P/V操作,实现进程的阻塞/唤醒
| 与信号量的不同点 | - 条件变量没有值,仅实现“排队等待”功能
- 信号量有值,这个值反映了剩余资源数
| |
进程同步与互斥机制3:互斥锁
定义 | |
特点 | - 通常采用硬件机制实现
- 常用于多处理器系统【等待期间不用切换进程上下文,多处理器中,若上锁的时间短,则等待代价很低】
|
缺点 | |
代码 | |
进程同步与互斥机制4:信号量和PV操作
PV操作定义 | P操作 | - 将信号量值S减 1,表示「申请占用一个资源」
- 如果 s≤ 0,表示已经没有可用资源,则执行 P 操作的进程被阻塞
 - 如果 s>0,表示现有的资源足够使用,则执行 P 操作的进程继续执行
 - 举例:
- 当信号量的值为2时,表示有 2 个资源可以使用;
- 当信号量的值为-2的时候,表示有两个进程正在等待使用这个资源
| V操作 | - 将信号量值S加 1,表示「释放一个资源」,即使用完资源后归还资源
- 由于我们已经释放出一个资源了,因此需要唤醒阻塞进程
| |
常见问题 | 1、S>0表示有临界资源可供使用,这个时候为什么不需要唤醒进程? | - 所谓唤醒进程是从就绪队列(阻塞队列)中唤醒进程,而信号量的值大于 0 表示有临界资源可供使用
- 也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒,正常运行即可
| 2、S=0表示没有临界资源可供使用,为什么还要唤醒进程? | - V 操作是先执行S+1,也就是说,把信号量的值加1后才变成了0
- 在此之前,信号量的值是-1,即有一个进程正在等待这个临界资源,我们需要唤醒它
| |
信号量分类 | 整型信号量 | - 该信号量被定义为一个用于表示资源数目的整型量S
- 该机制不遵循“让权等待”的准则
| 记录型信号量 | - 是一种不存在“忙等”现象的进程同步机制【遵循“让权等待”的准则】
- 需要一个用于代表资源数目的变量Value
- 需要一个进程链表L,用于链接所有等待该资源的进程
- wait操作 = P操作 = 请求一个资源
- signal操作 = V操作 = 释放一个资源
| |
信号量应用 | 利用信号量实现同步 | 同步信号量初始值不确定,可以自行设置 | 信号量最大值 = 最多可以请求的资源数 | 信号量最小值 = 最大值/初始值 - 最大请求值 | - 用资源P操作;
- 释放资源V操作;
- 此时信号量表示资源量
| 利用信号量实现互斥 | 互斥信号量初始值 = 1,表示临界区只允许一个进程进入,从而实现互斥 | 互斥信号量=0,表示临界区已经有一个进程进入,临界区外还没有进程等待 | 互斥信号量<0,表示临界区中有一个进程,临界区外有进程等待,且|互斥信号量| 表示在临界区外等待进入的进程数 | | 利用信号量实现前驱关系 | | |
这篇关于操作系统【OS】Ch2 进程同步与互斥机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!