【Linux】浅谈信号量

文章目录

  • 一、共享内存的弊端
    • 新概念引入
  • 二、理解信号量
    • 原子性


tips:system V 是一套标准,共享内存,信号量,消息队列属于system V。

一、共享内存的弊端

在这里插入图片描述

进程A和进程B进行通信时,假如进程A向物理内存的共享区写入"Hello World",但是当进程A写入了"Hello"时,进程B就向内存读取了,所以只读取到了"Hello",这就导致进程A想向进程B发送的信息,进程B读取不完整,导致了数据的不完整!

因为共享内存是没有任何保护机制的!!

不同于管道,管道拥有同步和互斥问题,可以解决数据不一致问题。

为了解决上述问题,先引入几个概念。

新概念引入

  • 1.当A和B看到的同一份资源,这份资源叫做共享资源,如果不加保护,可能会导致数据不一致问题
  • 2.只允许一个执行流访问共享资源,那么这份资源就具有互斥功能。
  • 3.如果一份资源,任何时刻只允许一个执行流访问,这份资源叫做临界资源。而临界资源,一般是内存。比如管道也是临界资源。
  • 4.假如有100行的代码,我们此时在实现通过管道进行进程间通信,而我们访问管道的方式就是通过代码访问的,管道又是临界资源,所以访问管道的那几行代码,5~10行代码,才是在访问临界资源,而访问临界资源的这部分代码,叫做临界区

为什么在多进程,多线程并发打印时,打印的内容是错乱的??

多个进程要向同一块显示器上打印信息,就先保证所有进程都看到同一份资源。而显示器也是文件,也属于一份共享资源,由于没有加以任何保护,在进程1打印的同时,进程2也向显示器文件打印,就造成了混乱问题。

二、理解信号量

信号量的本质是一把计数器,类似但不等于 int count = n;

是描述临界资源数量的多少!!!

当我们去看电影的时候,我们还没看,要先买票。买票的本质是对资源的预定机制。
那么票数的计数器,每卖一张票,就要对计数器-1,也就意味着电影院里面的资源就少一个!
当票数计数器为0的时候,电影院的资源就被申请完毕了。

与临界资源(只能有一个执行流访问资源)相对应:
最担心的情况就是:

  • 一份临界资源,有多个执行流访问。
  • n份临界资源,有 > n的执行流访问,就会出现第一种情况。

所以为了解决这个问题,就有了计数器的概念。
在操作系统的管理中,临界资源是有限的,当执行流申请访问资源时,操作系统就会通过分配算法给执行流分配临界资源,从而保证不同的执行流访问不同的临界资源。并且当临界资源计数器 = 0时,临界资源被申请完毕,还有执行流想要申请临界资源时,操作系统就会禁止该执行流申请资源。

在这里插入图片描述

所以,管道的互斥就可以解释成:只有一个执行流在访问临界资源,就叫做互斥!

结论:

  • 1.申请计数器成功,表示我当前具有访问资源的权限。
  • 2.申请了计数器资源,我当前可以不访问我要的资源,因为此时我申请计数器资源是对资源的预定机制。
  • 3.计数器可以有效保证进入临界资源的执行流的数量。
  • 4.每一个执行流想要访问临界资源,就先申请计数器资源。程序员把这个计数器资源,叫做信号量。
  • 5.我们把值为只有0,1两态的计数器,叫做二元计数器;本质上就是锁。

那为什么要让计数器的值为1呢?
当我们把临界资源看成一个整体,此时就只有一个执行流能申请到该临界资源。整体申请,整体释放!这就是互斥!!!


但是,要访问临界资源,就先申请计数器资源。

计数器资源的存在就是为了保护临界资源只能有一个执行流访问的。

计数器资源也是共享资源,因为它能被多个执行流看到,能被多个执行流申请资源它要保护别人,就得先保护自己!!!

然而, 计数器本身并不是安全的。

int count = 1;
count--;

其中count--这条语句,在c语言上就是一条代码,但是在汇编层面上,就会被翻译成3条语句:
1.count变量的内容,从内存拷贝到CPU的寄存器中
2.CPU内对count进行–
3.将计算结果拷贝回count变量的内存位置。

具体怎么不安全后面会讲。

原子性

我们在申请信号量资源时,本质是对计数器–,这个操作叫做P操作。
在释放信号量资源时,本质是对计数器++,这个操作叫做V操作。

所以,在信号量的申请和释放的操作,就叫做PV操作。这个操作叫做原子的!!!

而原子性的概念简单理解为:要么不做,要做就做完,没有正在做的概念!!!

为什么把PV操作叫做原子的呢?

PV操作本质是对计数器–,++的操作。
翻译成汇编语句后,每一条汇编语句就是原子的!!!

因为一条汇编语句,只能是要么没有执行,要么已经执行,没有正在执行的说法!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/230549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出:HTTPS单向与双向认证及证书解析20231208

介绍: 网络安全的核心之一是了解和实施HTTPS认证。本文将探讨HTTPS单向认证和双向认证的区别,以及SSL证书和CA证书在这些过程中的作用,并通过Nginx配置实例具体说明。 第一部分:HTTPS单向认证 定义及工作原理:HTTPS单向认证是一…

前端:HTML+CSS+JavaScript实现轮播图2

前端:HTMLCSSJavaScript实现轮播图2 1. 和之前版本的区别2. 实现原理3. 针对上述的改进3. 参考代码 1. 和之前版本的区别 之前发布的那篇关于轮播图的文章在这:前端:HTMLCSSJavaScript实现轮播图,只能说存在问题吧!比…

Redis KEY*模糊查询导致速度慢、阻塞其他 Redis 操作

Redis KEY*模糊查询导致交互速度慢、阻塞其他 Redis 操作 查询速度慢的原因 在Redis中,使用通配符 KEYS 命令进行键的模糊匹配(比如 KEYS key*)可能会导致性能问题,尤其是在数据集较大时。这是因为 KEYS 命令的实现需要遍历所有…

输入/输出控制详解(块、字符设备?程序控制?中断、DMA又是啥?)

输入/输出(I/O) 输入/输出(I/O)控制是计算机系统中的一个关键概念,涉及到计算机与外部设备之间的数据传输。计算机系统通过输入设备接收用户输入,通过输出设备向用户显示结果。输入/输出控制包括管理和协调…

1.查看表的基本结构,表的详细结构和修改表名

查看表的基本结构,表的详细结构和修改表名 1.查看数据表基本结构 有强迫症或健忘症的小伙伴们在建好数据库和表以后,通常会怀疑自己刚才是不是敲错了,怎么办?如果不是使用图形界面是不是就没法查看啦? 不存在的,这就…

PDF控件Spire.PDF for .NET【转换】演示:将 SVG 转换为 PDF

SVG 是一种矢量图形文件格式,用于创建可缩放且不损失质量的图像。然而,PDF由于支持高质量打印、加密、数字签名等功能,更适合共享和打印。将SVG转换为PDF可以保证图像在不同设备和环境下都有良好的显示效果,并更好地保护知识产权。…

【数据结构 — 排序 — 插入排序】

数据结构 — 排序 — 插入排序 一.排序1.1.排序的概念及其运用1.1.1排序的概念1.1.2排序运用1.1.3 常见的排序算法 二.插入排序2.1.直接插入排序2.1.1.算法讲解2.1.2.代码实现2.1.2.1.函数定义2.1.2.2.算法接口实现2.1.2.3.测试代码实现2.1.2.4.测试展示 2.2.希尔排序2.2.1.算法…

苹果IOS在Safari浏览器中将网页添加到主屏幕做伪Web App,自定义图标,启动动画,自定义名称,全屏应用pwa

在ios中我们可以使用Safari浏览自带的将网页添加到主屏幕上,让我们的web页面看起来像一个本地应用程序一样,通过桌面APP图标一打开,直接全屏展示,就像在APP中效果一样,完全体会不到你是在浏览器中。 1.网站添加样式 在…

Leetcode2477. 到达首都的最少油耗

Every day a Leetcode 题目来源:2477. 到达首都的最少油耗 解法1:贪心 深度优先搜索 题目等价于给出了一棵以节点 0 为根结点的树,并且初始树上的每一个节点上都有一个人,现在所有人都需要通过「车子」向结点 0 移动。 对于…

基于ResNet模型的908种超大规模中草药图像识别系统

中草药药材图像识别相关的实践在前文中已有对应的实践了,感兴趣的话可以自行移步阅读即可: 《python基于轻量级GhostNet模型开发构建23种常见中草药图像识别系统》 《基于轻量级MnasNet模型开发构建40种常见中草药图像识别系统》 在上一篇文章中&…

操作系统 2-6 课后作业2.3:系统调用

第1关版本1内核执行的完整系统调用序列 任务描述 分析版本1内核,回答下列问题: 从系统开机直到输出第 4 个字符‘1’,系统依次执行了哪些系统调用?分别是在几号进程中执行的?(对于一组连续出现的 0 号进程…

进程控制与原语

一、 进程的五种状态 在操作系统中,一个进程可以经历五种基本状态,这被称为进程的五种基本状态模型。这包括: 创建状态(Create/New): 进程刚刚被创建,但还未被执行。在这个状态下,操…

JAVA 锁

乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出…

CGAL的多边形曲面重建

1、介绍 该软件包实现了一种基于假设和选择的方法,用于从点云重建分段平面对象。该方法将从分段平面对象采样的无序点集作为输入。输出是对输入点集进行插值的紧凑且不透水的曲面网格。该方法假设提供了所有必要的主平面(或者可以使用在形状检测中描述的…

如何使用玻璃材质制作3D钻石模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

MySQL 8 update语句更新数据表里边的数据

数据重新补充 这里使用alter table Bookbought.bookuser add userage INT after userphone;为用户表bookuser在userphone列后边添加一个类型为INT的新列userage。 使用alter table Bookbought.bookuser add sex varchar(6) after userage ;为用户表bookuser在userage 列后边添…

Hibernate 框架 (2023年架构师下半年案例分析题)

Hibernate 是一种对象和关系之间映射的框架,是 Java 应用和关系数据库之间的桥梁。它可以将数据库资源映射为一个或者多个 POJO。将面向数据库资源的各种业务操作以 POLO 的属性和方法的形式实现,使人们摆脱烦琐的 JDBC 代码,将精力更多地集中…

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C program for the above approach #include <bits/stdc.h> using namespace std; // Size of the array a[] const int mxN 1005; // Structure to store the x and // y coordinates of a point struct Coordinates { double x, y; } a[mxN]; //…

【Linux下基本指令 —— 2】

Linux下基本指令 —— 2 十.more 指令语法&#xff1a;功能&#xff1a;常用选项&#xff1a;举例&#xff1a;Xshell7展示十一.less 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell7展示 十二.head 指令语法&#xff1a;功能&#xff1a;选项&#xff1a;Xshell…

智能优化算法应用:基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…