操作系统【OS】Ch2 进程同步与互斥机制

2024-01-25 23:28

本文主要是介绍操作系统【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这类题目如果看到是管程外这个字眼,那就是错误的,管程的组成都是基于管程内部的

  • 管程的名字
  • 局部于管程内部的共享数据结构或者共享变量说明
  • 对管程内的数据结构进行操作的一组过程
  • 对局部于管程内部的共享数据设置初始值的语句

特点

  • 局部于管程的数据只能被局部于管程的过程所访问
  • 一个进程只能通过调用管程内的过程才能进入管程访问共享数据
  • 每次仅允许一个进程在管程内执行某个内部过程

管程中设置的条件变量

定义

  • 阻塞原因定义为条件变量condition

有两种操作

  • x.wait:阻塞进程,将其插入到阻塞队列中
  • x.signal:唤醒进程,将其插入到就绪队列中

与信号量的相似点

  • wait/signal类似于信号量的P/V操作,实现进程的阻塞/唤醒

与信号量的不同点

  • 条件变量没有值,仅实现“排队等待”功能
  • 信号量有值,这个值反映了剩余资源数

 

进程同步与互斥机制3:互斥锁

定义

  • 解决临界区最简单的工具

特点

  • 通常采用硬件机制实现
  • 常用于多处理器系统【等待期间不用切换进程上下文,多处理器中,若上锁的时间短,则等待代价很低】

缺点

  • 缺点:违反“让权等待”

代码

  • acquire()获取锁
  • release()释放锁

 

 

进程同步与互斥机制4:信号量和PV操作

PV操作定义

P操作

  • 将信号量值S减 1,表示「申请占用一个资源」
  • 如果 s≤ 0,表示已经没有可用资源,则执行 P 操作的进程被阻塞
  • 如果 s>0,表示现有的资源足够使用,则执行 P 操作的进程继续执行
  • 举例:
    • 当信号量的值为2时,表示有 2 个资源可以使用;
    • 当信号量的值为-2的时候,表示有两个进程正在等待使用这个资源

V操作

  • 将信号量值S加 1,表示「释放一个资源」,即使用完资源后归还资源
  • 由于我们已经释放出一个资源了,因此需要唤醒阻塞进程
  • PV操作是低级进程通信语言

常见问题

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,表示临界区中有一个进程,临界区外有进程等待,且|互斥信号量| 表示在临界区外等待进入的进程数

  • PV操作夹着互斥资源;
  • 此时信号量表示互斥量

利用信号量实现前驱关系

  • 描述程序之间或语句之间的前驱关系

这篇关于操作系统【OS】Ch2 进程同步与互斥机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644955

相关文章

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程