【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操作本质是对计数器–,++的操作。
翻译成汇编语句后,每一条汇编语句就是原子的!!!

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用AI来纠正错别字和修饰文字

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 在使用谷歌翻译或百度翻译将英语翻译成中文时,有些句子读起来不太流畅。我尝试使用AI来帮助我修改翻译后的中文,希望能让句子更符合中文习惯。 使用百度文心一言尝试一下。 文心一言的链接是这个&#x…

Axure官方软件安装、汉化保姆级教程(带官方资源下载)

1.下载汉化包 百度云链接:https://pan.baidu.com/s/1lluobjjBZvitASMt8e0A_w?pwdjqxn 提取码: jqxn 2.解压压缩包 3.安装Axure 进行安装 点击next 打勾,然后next, 默认是c盘,修改成自己的文件夹(不要什么都放c盘里…

【vSphere | VM】虚拟机自定义规范Ⅱ——创建 Windows 虚拟机自定义规范

目录 3. 创建关于Windows系统的虚拟机自定义规范3.1 新建 Windows 虚拟机自定义规范(1)名称和目标操作系统(2) 注册信息(3)计算机名称使用虚拟机名称输入名称 (4)Windows 许可证(5)管…

C++-类和对象

目录 一.C语言和C的区别 二.类的引入 三.类的定义 1.类的定义 2.类的成员方法的两种定义方式: 3.类的成员变量的定义 四.类的访问限定符及封装 1.访问限定符 五.面向对象的三大特征 1.面向对象的三大特征分别是什么 2.封装 六.类的作用域 七.创建类对象 1.类…

PyQt6 QTimeEdit时间控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

Grad-CAM原理

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 只要大家一提到深度学习 缺乏一定的解释性 比如说在我们之前讲的分类网络当中 网络它为什么要这么预测 它针对每个类别所关注的点在哪里呢 在great cam这篇论文当中呢 就完美的解决了在cam这篇论…

初识Linux:权限(2)

目录 权限 用户(角色) 文件权限属性 文件的权限属性: 有无权限的区别: 身份匹配: 拥有者、所属组的修改: 八进制的转化: 文件的类型: x可执行权限为什么不能执行&#xf…

MySQL 教程 2.1

MySQL 插入数据 MySQL 表中使用 INSERT INTO 语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name (colu…

Mysql 日期函数大全

一、时间函数 (一)、获取当前时间 1、NOW() 获取当前日期和时间,在程序一开始执行便拿到时间 返回格式 YYYY-MM-DD hh:mm:ss eg: NOW() 得到 2023-12-03 12:20:02 NOW(),SLEEP(2),NOW() 得到 2023-12-03 12:20:02 | 0 | 2023-…

基于YOLOv7算法和Caltech数据集的高精度行人目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要:基于YOLOv7算法和Caltech数据集的高精度行人目标检测系统可用于日常生活中检测与定位行人目标,此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别,同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算…

LLM时代,数据为王,19个开源数据集下载网站汇总

大模型时代,数据为王,在哪里寻找开源数据集,是一个比较头疼的问题。经过调研整理,下面列出了目前可以寻找开源大模型数据集的网站清单。 1、HuggingFace开源数据集 链接:https://huggingface.co/datasets 镜像&#…

手持风速风向仪一款便携的气象仪

你曾经有过这样的经历吗?在野外露营,却无法知道风的方向和速度,或者在海洋上航行,却无法预测天气的变化。现在,我们有了手持风速风向仪,一切困扰都将烟消云散。 WX-QX20手持风速风向仪是一种科技感十足的设…