操作系统学习笔记2.3互斥
文章目录
- 进程同步
- 实现方式
- 进程互斥
- 实现方式
- 软件实现方法
- 硬件实现方法
- 同步问题
- 生产者-消费者问题
- 问题描述
- 解决方案
- 代码解析
- 多生产者-多消费者问题
- 问题描述
- 解决方案
- 代码解析
- 总结
- 抽烟者问题
- 问题背景
- 同步与互斥的挑战
- 解决方案
- 实现步骤
- 代码解释
- 关键点
进程同步
进程同步是指多个进程在执行时,为了协调彼此的执行顺序和数据共享,确保它们能够正确地访问共享资源,而采取的一系列机制。主要目的是避免竞争条件,确保数据的一致性和完整性。
实现方式
-
信号量(Semaphore):一种同步机制,可以控制多个进程对共享资源的访问。信号量有两种类型:
记录型信号量的定义数据结构
还是要稍微记一下
typedef struct{
int value;
Struct process *L;
}semaphore;
P操作(等待操作):申请资源,尝试获取信号量。如果信号量的值大于0,则将其减1,表示占用一个资源;如果值为0,则进程进入等待状态。
V操作(释放操作):释放资源, 释放信号量,将其值加1,表示释放一个资源。如果有其他进程在等待这个信号量,则唤醒其中一个进程。
信号量机制实现前驱关系
看着吓人,实际上一般,牢牢记住,前V后P。
-
互斥锁(Mutex):专门用于实现互斥的锁,保证在同一时刻只有一个进程能够访问共享资源。
-
条件变量(Condition Variable):用于在某些条件不满足时,阻塞一个进程,并在条件满足时通知它继续执行。
-
读写锁:允许多个进程同时读取资源,但在写入时只能有一个进程访问。
进程互斥
原则:
空闲让进
忙则等待
优先等待
让权等待
进程互斥是指多个进程在访问共享资源时,必须保证同一时刻只有一个进程可以访问。互斥是实现同步的基础,防止竞争条件的发生。
实现方式
-
互斥锁:同上所述,确保在任意时刻只有一个进程可以获得锁,从而访问共享资源。
-
信号量:通过设置信号量的值为1来实现互斥。
本质上是一个变量。使用原语操作,waitS),signal(S),P,V操作 -
自旋锁:一种轻量级的锁,当一个进程发现锁已被其他进程占用时,会在循环中持续检查,而不是被挂起。
-
临界区:使用临界区机制,确保同一时刻只有一个进程能够进入访问共享资源的区域。
软件实现方法
单标志法:只判断
双标志先检查法:两个bool量,先判断是否要上厕所
双标志后检查法:先上锁后检查
Peterson算法。即判断,也谦让
硬件实现方法
中断屏蔽指令
测试和设置(Test-and-Set):测试和设置是一种简单的原子操作,用于实现互斥锁。
swap指令:
互斥锁
同步问题
生产者-消费者问题
生产者-消费者问题是经典的同步问题,涉及两个进程:生产者和消费者,它们共享一个固定大小的缓冲区。生产者负责生成数据并放入缓冲区,而消费者则从缓冲区中取出数据进行处理。问题在于如何协调这两个进程,以确保数据的一致性和缓冲区的有效使用。
问题描述
- 缓冲区:固定大小的缓冲区,通常用数组实现,限制生产者和消费者的并发行为,必须要互斥访问,。
- 生产者:生成数据并放入缓冲区。如果缓冲区满,生产者需要等待。
- 消费者:从缓冲区取出数据进行处理。如果缓冲区空,消费者需要等待。
解决方案
为了解决这个问题,可以使用信号量、互斥锁和条件变量来实现生产者和消费者之间的同步。
代码解析
- 缓冲区:使用数组
buffer
实现,in
和out
指针分别表示生产者和消费者的操作位置。 - 信号量:
empty
:表示空缓冲区的数量,初始值为数组大小。full
:表示满缓冲区的数量,初始值为 0。
- 互斥锁:
mutex
用于保护对缓冲区的访问。 - 生产者和消费者:分别在
producer
和consumer
函数中实现,使用信号量和互斥锁控制对缓冲区的访问。
多生产者-多消费者问题
多生产者多消费者问题是生产者-消费者问题的扩展,涉及多个生产者和多个消费者共享一个固定大小的缓冲区。这个问题的关键在于如何有效地管理多个生产者和消费者之间的同步,以确保数据的一致性和缓冲区的有效使用。
问题描述
- 缓冲区:固定大小的缓冲区,限制生产者和消费者的并发行为。
- 多个生产者:同时生成数据并放入缓冲区。
- 多个消费者:同时从缓冲区取出数据进行处理。
- 同步需求:需要确保在缓冲区满时,生产者能够等待;在缓冲区空时,消费者能够等待。
解决方案
可以使用信号量、互斥锁和条件变量来实现多生产者和多消费者之间的同步。
代码解析
- 缓冲区:使用数组
buffer
实现,in
和out
指针分别表示生产者和消费者的操作位置。 - 信号量:
empty
:表示空缓冲区的数量,初始值为BUFFER_SIZE
。full
:表示满缓冲区的数量,初始值为 0。
- 互斥锁:
mutex
用于保护对缓冲区的访问。 - 多个生产者和消费者:通过循环创建多个生产者和消费者线程,并传递各自的ID以便于打印。
总结
注意一定要从事件的角度分析问题而不是关系相互之间的角度分析问题
抽烟者问题
问题背景
问题设定如下:
-
三个抽烟者:每个抽烟者缺少某一种材料才能卷烟抽烟。
- 第一个抽烟者缺少烟草,他拥有纸和火。
- 第二个抽烟者缺少纸,他拥有烟草和火。
- 第三个抽烟者缺少火柴,他拥有烟草和纸。
-
制造者:制造者随机地将两种不同的材料放在桌子上,每次会放两种材料,留下一种材料供缺少该材料的抽烟者使用。
-
抽烟流程:
- 制造者每次将两种材料放在桌子上,然后通知对应缺少材料的抽烟者来取材料。
- 如果桌上有烟草和纸,缺少火的抽烟者会取走它们并开始抽烟。
- 每个抽烟者在使用材料后,必须通知制造者继续放新的材料。
同步与互斥的挑战
-
互斥问题:同一时刻,最多只有一个抽烟者能拿走材料并抽烟,其他人必须等待桌子上有他们所需的材料。因此需要控制抽烟者对桌上资源的访问,避免冲突。
-
同步问题:抽烟者不能盲目行动,必须等到制造者放好了他们所需的材料后才能拿走。这种同步控制通常通过信号量或者条件变量实现。
解决方案
- 使用互斥量:互斥量可以保证在任意时刻,只有一个抽烟者在访问桌子上的资源。
- 使用条件变量:条件变量可以让抽烟者等待直到满足特定条件(即桌子上有他们所需的两种材料),然后进行操作。
实现步骤
下面是详细的实现思路:
-
全局变量:
tobacco
:标志桌子上是否有烟草。paper
:标志桌子上是否有纸。fire
:标志桌子上是否有火。mtx
:互斥锁,用于保护对这些变量的并发访问。cv
:条件变量,用于通知抽烟者材料已经准备好。
-
制造者逻辑:
- 制造者随机放置两种材料在桌子上。
- 制造者放好材料后,唤醒等待的抽烟者。
- 制造者必须确保材料放置正确,并且在每轮抽烟后重新放置新的材料。
-
抽烟者逻辑:
- 抽烟者在循环中工作,不断检查桌子上是否有他们需要的材料。
- 抽烟者在检测到自己所缺少的材料后,取走材料并抽烟。
- 抽烟完后,抽烟者需要通知制造者以便放置新的材料。
代码解释
std::mutex mtx;
:用于保护访问共享资源的互斥锁,防止多个抽烟者同时访问桌子上的材料。std::condition_variable cv;
:条件变量,用于同步制造者和抽烟者之间的工作,抽烟者会等待材料齐全时才会行动。smoker
函数:- 抽烟者会根据他们所缺少的材料来决定何时行动。当条件满足时,即桌子上有他所需要的两种材料时,他会取走材料并抽烟。
- 抽烟结束后,抽烟者会清空桌子上的材料标志并通知制造者。
manufacturer
函数:- 制造者会随机生成两种不同的材料放在桌子上。
- 每次生成材料后,制造者会通知抽烟者桌上材料已准备好。
关键点
- 互斥和同步:通过互斥量保证每次只能有一个抽烟者拿走材料,同时使用条件变量来实现制造者和抽烟者之间的同步。
- 死锁和饥饿:代码通过合理使用条件变量和互斥量避免了死锁和饥饿现象。
相关文章:
操作系统学习笔记2.3互斥
文章目录 进程同步实现方式 进程互斥实现方式 软件实现方法硬件实现方法同步问题生产者-消费者问题问题描述解决方案代码解析 多生产者-多消费者问题问题描述 解决方案代码解析总结 抽烟者问题问题背景 同步与互斥的挑战解决方案实现步骤代码解释 关键点 进程同步 进程同步是指…...
LLM - 使用 Neo4j 可视化 GraphRAG 构建的 知识图谱(KG) 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142938982 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Neo4j …...
Linux 环境的搭建方式->远程登录->免密登录
个人主页:Jason_from_China-CSDN博客 所属栏目:Linux系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:Linux知识点的补充_Jason_from_China的博客-CSDN博客 Linux 环境的搭建方式 Linux 环境的搭建主要有三种方式: 直接安…...
react18中的计算属性及useMemo的性能优化技巧
react18里面的计算属性和使用useMemo来提升组件性能的方法 计算属性 实现效果 代码实现 函数式组件极简洁的实现,就这样 import { useState } from "react"; function FullName() {const [firstName, setFirstName] useState("");const [la…...
Python 实现高效的 SM4 大文件加密解密实战指南20241024
Python 实现高效的 SM4 大文件加密解密实战指南 引言 在数据安全领域,使用对称加密算法如SM4进行数据保护非常常见。特别是当处理大文件时,合理的内存和块大小管理以及加密解密效率变得尤为重要。本文将分享如何使用Python进行大文件的SM4加密解密操作&…...
数据结构~红黑树
文章目录 一、红黑树的概念二、红黑树的定义三、红黑树的插入四、红黑树的平衡五、红黑树的验证六、红黑树的删除七、完整代码八、总结 一、红黑树的概念 红黑树是一棵二叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过…...
【ROS GitHub使用】
提示:环境配置为Ubuntu20.04&ROS Noetic 文章目录 前言一、创建工作空间目录二、尝试从GitHub上下载一个源码包,对它进行编译,运行这个源码包1.打开script文件夹,右键文件夹空白区域,选择在中端中打开;…...
批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法
批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法 错误原因解决方案1. 分批处理2. 使用xargs3. 增加ARG_MAX限制4. 使用脚本 结论 在Linux系统中,有时你可能会遇到这样的错误消息:“/usr/bin/chmod: Argument lis…...
数据结构——树——二叉树——大小堆
目录 1>>导言 2>>树 2.1>>树的相关术语 2.2>>树的表示和应用场景 3>>二叉树 3.1>>完全二叉树 3.2>>大小根堆 4>>结语 1>>导言 上篇小编将队列的内容给大家讲完了,这篇要步入新的篇章,请宝…...
Android Junit 单元测试 | 依赖配置和编译报错解决
问题 为什么在依赖中添加了testImplement在build APK的时候还是会报错?是因为没有识别到test文件夹是test源代码路径吗? 最常见的配置有: implementation - 所有源代码集(包括test源代码集)中都有该依赖库.testImplementation - 依赖关系仅在test源代码…...
ffmpeg视频滤镜: 裁剪-crop
滤镜简述 crop官网链接 > FFmpeg Filters Documentation crop滤镜可以对视频进行裁剪,并且这个滤镜可以接受一些变量比如时间和帧数,这样我们实现动态裁剪,从而实现一些特效。 滤镜使用 参数 out_w <string> ..…...
身份证归属地查询接口-在线身份证归属地查询-身份证归属地查询API
接口简介:输入身份证号码可查询到所属地区、出生年日月以及性别。 接口地址:https://www.wapi.cn/api_detail/60/167.html 在线核验:https://www.wapi.cn/icard.html 网站地址:https://www.wapi.cn 返回格式:json,xml,…...
ESP32 S3 怎么开发基于ESP-RTC的音视频实时交互的应用,用语AI陪伴的领域
在ESP32-S3平台上开发基于ESP-RTC的音视频实时交互应用,尤其是在AI陪伴领域,涉及到音视频数据的采集、编码、传输和解码。ESP32-S3 具备较强的处理能力,且拥有丰富的接口和模块支持,可以用来实现这种功能。以下是一个完整的开发方…...
车载测试分享:UDS诊断、ECU刷写、CAN一致性测试、网络通讯测试、CANoe使用、报文解析、问题定位分析
FOTA模块中OTA的知识点:1.测试过程中发现哪几类问题? 可能就是一个单键的ecu,比如升了一个门的ecu,他的升了之后就关不上,还有就是升级组合ecu的时候,c屏上不显示进度条。 2.在做ota测试的过程中…...
预算不够,怎么跟KOL砍价?(内附砍价模板)
在当今的数字营销时代,海外红人(KOL)的影响力不容小觑。他们的一篇帖子、一个视频,甚至是一张照片,都有可能为企业带来巨大的流量和销量。 当企业满怀希望地找到一位粉丝众多、影响力强的KOL,准备洽谈合作…...
C#从零开始学习(GameObject实例)(unity Lab3)
这是书本中第三个unity Lab 在这次实验中,将学习如何使用C#编写代码用unity编写C#代码 GameObject实例 本次将完成的工作 将游戏资产配置在文件夹中创建材质把GameObject变成预制件脚本控制游戏防止球体重叠 将游戏资产配置在文件夹中 Script放代码 Prefabs放预制件 MAteria…...
谷歌地图 | 与 Android 版导航 SDK 集成的最佳实践
谷歌最近宣布了导航 SDK,它可以让您将熟悉的 Google 地图逐向导航体验无缝集成到您的 Android 和 iOS 应用程序中。 这篇博文概述了一些最佳实践,您可以使用这些实践为您的 Android 应用程序使用导航 SDK 构建流畅、一致且可靠的导航体验。 与导航地图…...
什么是 VolTE 中的 Slient Redial?它和 CSFB 什么关系?
目录 1. 什么是 Silent Redial(安静的重拨号)? 2. Silent Redial 信令流程概述 3. 总结 Silent Redial 和 CSFB 啥关系? 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都…...
docker 部署单节点的etcd以及 常用使用命令
docker部署etcd $ docker run -d --name etcd-server -p 2379:2379 -p 2380:2380 quay.io/coreos/etcd:v3.5.0 /usr/local/bin/etcd -name my-etcd-1 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http…...
华为开放式耳机测评,南卡 、华为、Cleer开放式耳机超深度横评
近年来,开放式蓝牙耳机因其独特的设计和优势受到了越来越多消费者的青睐。其实对于开放式耳机,大家都没有一个明确的概念,可能会为了音质的一小点提升而耗费大量的资金,毕竟这是一个无底洞。 作为在过去一年体验过不下20款开放式耳…...
【Power Query】List.Select 筛选列表
List.Select 筛选列表 ——在列表中返回满足条件的元素 List.Select(列表,判断条件) 不是列表的可以转成列表再筛选,例如 Record.ToList 不同场景的判断条件参考写法 (1)单条件筛选 列表中小于50的数字 List.Select({1,99,8,98,5},each _<50) (2)多条件筛…...
Spring--4
SpringWeb 概念 是Spring框架的一个模块,基于Servlet的一个原始Web框架。 SpringWEB 运行流程 描述:前端用户请求发送的后端以后,先经过前端控制器DispatcherServlet(再次之前也可能有过滤器的存在),经过前端控制器解析后&…...
django celery 定时任务 Crontab 计划格式
Celery 定时任务教程 Celery 是一个强大的异步任务队列/作业队列基于分布式消息传递的开源项目。它广泛用于处理各种类型的后台任务,例如发送电子邮件、处理图像、数据分析和视频转换等。 本文将介绍如何使用 Celery 实现定时任务,包括: 安…...
动态应用程序安全测试 (DAST) 工具 Fortify WebInspect
Fortify WebInspect 是一种动态应用程序安全测试 (DAST) 工具,可识别所部署的Web 应用程序和服务中的应用程序漏洞。 OpenText™ 推出的 Fortify WebInspect 是一种自动化DAST 解决方案,可提供全面的漏洞检测能力并有助于安全专业人士和 QA 测试人员识别安全漏洞和…...
深入解析东芝TB62261FTG,步进电机驱动方案
TB62261FTG是一款由东芝推出的两相双极步进电机驱动器,采用了BiCD工艺,能够提供高效的电机控制。这款芯片具有多种优秀的功能,包括PWM斩波、内置电流调节、低导通电阻的MOSFET以及多种步进操作模式,使其非常适合用于需要精确运动控…...
Vue 常用的狗钩子函数
beforeCreate(){ console.log(刚刚创建实例); },created(){console.log(实例创建完成);},beforeMount(){console.log(模板编译之前 ); },mounted(){/* 请求数据,操作Dom时常用 */console.log(实力挂载完成);},beforeUpdate(){console.log(更新前)},update…...
【机器学习基础】激活函数
激活函数 1. Sigmoid函数2. Tanh(双曲正切)函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面,导数是为了求参数W和B,W和B是在我们模型model确定之后,找出一组最优的W和B,使…...
nnMamba用于糖尿病视网膜病变检测测试
1.代码修改 源码是针对3D单通道图像的,只需要简单改写为2D就行,修改nnMamba4cls.py代码如下: # -*- coding: utf-8 -*- # 作者: Mr Cun # 文件名: nnMamba4cls.py # 创建时间: 2024-10-25 # 文件描述:修改nnmamba,使…...
【Spring MVC】创建项目和建立请求连接
我的主页:2的n次方_ 1. MVC MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。 View (视图): 指在应⽤程序中专⻔⽤来与浏览器进⾏交互&…...
台达A2伺服
驱动器: L 外接脉冲 U 在L的基础上增加DI E ethercat总线 F 台达 M CANopen总线 电机: ECMA-C A 0604 SS...
自己做的网站如何赚钱吗/公众号推广接单平台
微软于周二(3/2)重新释出MS10-015修补程序。由于先前使用者安装该程序时,若电脑中含有Alureon rootkit就会出现更新错误,因而微软也提醒使用者先行杀毒,并避免安装后可能造成的蓝屏画面。 MS10-015是微软在今年2月用来…...
网站建设 工作建议/广州专做优化的科技公司
原创;微信公众号:千里行走;受限图片大小限制,有些图片不是很清晰,可以到微信公众号查看;目录(1).前述(2).nginx生产级别高性能配置正文(1).前述笔者在github提供了完整的配置文件,同时包含代理基…...
建设留学网站/产品网络营销方案
1、 1) 2) 3) 4) 2、 1) 2)AVL 3)B树 B树 3、哈希表 转载于:https://www.cnblogs.com/KennyRom/p/6222387.html...
简述网站设计基本流程/杭州网站建设书生商友
一、ClickHouse 是什么?ClickHouse:是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)通过ClickHouse实践,完美的解决了MySQL查询瓶颈,20亿行以下数据量级查询,90%都可以在1s内给到结果,随着数据量增加&…...
手机网站建设策划方案/东莞网络营销推广专业
一.题目分析: 首先进行词库维护,包括相关单词记录的增删改查。查询部分要实现利用中文和英文都可以查询,还对同一中文意思的单词进行了显示。单词预览,通过读取文件中已有的单词,实现单词预览功能。单词背诵…...
昆山市做网站的公司/seo优化是怎么回事呢
数据导入和导出一、数据导入工具1、利用PLSQL直接进行数据表的粘贴(1)下载测试表(2)打开准备导入的文件并进行创建数据库表的SQL语句编辑A、复制表头到新的sheetB、选择粘贴C、选择转置,并按”确定“D、结果E、编辑表格,插入SQL语句注意:里面…...