十三.Linux——信号量

在学习信号量之前,我们要先了解一个同样可以实现进程间通信的方式------共享内存。

共享内存:多个进程的虚拟地址空间,映射到同一块物理内存。

实现:同样需要两个进程的实现。

a.c:共享内存的创建和输入值:

b.c:调用共享内存和打印内存中的值:

执行代码后,会发现一个很大的问题:打印端会一直循环打印,而不是输入端输入一个值,打印一个值,不输入就不打印;

这个时候就需要使用到今天的主角------信号量


信号量:特殊的变量,用来做同步、互斥,解决并发竞态问题;可进行加一减一操作,都是原子操作。

减一:p操作,代表获取资源,若信号量的值为0,无法减一,那么p阻塞。

加一:v操作,代表释放资源,信号量加一,不会阻塞。

临界资源:同时时刻只运行一个进程访问的资源

临界区:访问临界资源的代码段

信号量取值分为两种:

二值信号量:只取0,1

计数信号量:0,1,3,5.....

所有到底如何使用信号量,实现我们上面所说的需求呢??

原理:控制输入端信号量s1初始为1,控制输出端信号量s2初始为0;通过加一和减一操作来控制进程是否阻塞或运行。

代码要实现的函数接口:

sem_init();//初始化信号量

sem_p();//减一操作

sem_v();//加一操作

sem_destroy();//删除信号量(全部的)

接口代码实现:

更改后的a.c:

更改后的b.c:

初始信号量s1为1,s2为0,所以输入端正常执行p(s1),减为0,输出端堵塞;

只有当输入完成,执行v(s2) ,s2加一,此时输入端堵塞,输出端正常执行p(s2),减为0;

输出完成,执行v(s1),s1为1,s2为0,循环如此,就可以实现一写一读。


这就是信号量的全部内容,感谢您的观看!!

相关推荐
2601_966949659 分钟前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨2 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪3 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风3 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
readhere4 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI5 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz5 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
‎ദ്ദിᵔ.˛.ᵔ₎5 小时前
关于Linux 线程局部存储的认识
linux·运维