【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呢?

当我们把临界资源看成一个整体,此时就只有一个执行流能申请到该临界资源。整体申请,整体释放!这就是互斥!!!


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

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

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

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

cpp 复制代码
int count = 1;
count--;

其中count--这条语句,在c语言上就是一条代码,但是在汇编层面上,就会被翻译成3条语句:

1.count变量的内容,从内存拷贝到CPU的寄存器中

2.CPU内对count进行--

3.将计算结果拷贝回count变量的内存位置。

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

原子性

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

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

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

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

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

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

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

相关推荐
Hello.Reader7 小时前
100 人同时操作一座三维城市,为什么不需要服务器渲染 6000 帧?Rust + wgpu 多端并发架构实战
服务器·架构·rust
R²AIN SUITE7 小时前
多云或私有云环境怎么选项目管理工具?RainSuite等5种产品的8项部署验证
服务器·网络·数据库
隔振降噪研究员7 小时前
裁断机一响,楼板为什么会跟着抖?
大数据·linux·数据库·人工智能
wtblszn7 小时前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Yula99337 小时前
把“凌晨电话”消灭在邮件系统架构设计阶段——从运维痛点反推企业邮件系统的工程选择
运维·exchange·数据库管理员·企业邮箱管理员·企业电子邮件系统·企业通讯安全
女神下凡9 小时前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范
wuminyu15 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
海宇AI16 小时前
零信任架构实战:基于海宇个人风险报告构建自动化分期商城信用额度初审网关
运维·人工智能·架构·自动化
IMPYLH16 小时前
Linux 的时间为什么会被拨回去
linux·运维·服务器
2601_9632827717 小时前
寒地窄带通信工程实践:黑龙江哈尔滨对讲机选型、组网与合规运维总结
运维·服务器·网络