当前位置: 首页 > news >正文

秒懂Linux之消息队列与信号量(了解)

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

前言

消息队列原理

信号量理论

信号量原理

IPC资源


前言

消息队列与信息量目前已经不常用了,大家也可以参考共享内存去了解基本原理即可。

消息队列原理

  • 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
  • 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值特性方面

消息队列的创建: 

消息队列的删除:

消息队列的发送与接收: 

 

信号量理论

对于信号量我们可以这么理解:

  • 我们去电影院买票预定座位这种行为本质上就是信号量对资源的预定机制~
  • 这个资源并不是说被我持有才是我的,只要我预定了,在某一个时间点上那他就是我的~
  • 有多少票,就卖多少座位(资源),这样就能保证每一份资源都不会被并发访问~

信号量在这当中扮演的就是一个描述资源数量的计算器——int count = xx;

进程要想访问到资源就得进行以下步骤:

  • 申请信号量(买票)——预定——信号量申请成功(拿到资源) if(count>0) count-- else wait
  • 进行资源的访问
  • 释放信号量(看完电影,离开)——该资源可以别人申请——count++

这片区域称为保护临界资源的临界区~

不过需要注意一点:在多线程的场景下int是无法支撑住资源的描述的,就拿父子进程的写时拷贝就可以验证二者并无法看到同一份count,而且count不是原子性的,他会在执行期间被干扰~

所有的进程在访问临界资源时都必须要申请信号量——而前提是信号量能被所有进程看到,这意味着它本身就是共享资源。既然int count无法代表信号量(没有原子性),那么申请信号量(--)与释放信号量(++)这些操作(简称PV操作)又是如何保证原子性的?

下面我们来介绍三个函数

创建信号量:跟前面所学的共享内存一致~ nsems为创建信号量的个数

删除信号量:semnum为信号量的属性~

PV操作:nsops是对应哪一个信号量,sops为具体操作

信号量原理

用以下几点做总结:

  • 信号量就是对共享资源进行保护~
  • 用于同步(访问资源在不争抢的情况下,具有一定的顺序性。)例如食堂排队打饭~,也用于互斥(访问一部分共享资源时,任何时刻都只有我一个人。)例如直接买下整个电影院~
  • 被保护起来的,任何时刻都只允许一个进程访问的公共资源称为临界资源
  • 访问临界资源的代码称为临界区,其他的称为非临界区。所谓的保护临界资源,其实就是我们程序员去保护临界区
  • 原子性:操作对象的时候只有两种状态,要么还没开始,要么已经结束,绝不存在过程被干扰~

IPC资源

所谓的共享内存,消息队列,信号量本质上都属于IPC资源,而OS必然要对这些IPC资源作管理,如何管理?先描述,再组织~

通过强转为对应的指针就可以访问其结构所在的数据~那我们如何确定位于ipc[ ]中是哪一个IPC资源呢?

利用标记位设置进mode中自动帮我们判断~

但IPC资源后面渐渐退伍的根本原因还是在于它违背了Linux下一切皆文件的核心概念,如果ipc_id下存放的是对应的文件描述符还好,但它偏偏另搞一套体系,也造成了逐渐脱离大势的结果~


http://www.mrgr.cn/news/31476.html

相关文章:

  • python printf中文乱码
  • RabbitMq项目实战--延迟队列实现超时订单处理
  • 【HAProxy06】企业级反向代理HAProxy调度算法之其他算法
  • 【t365】基于springboot的高校疫情防控系统
  • RHCE-第四章:ssh远程连接服务器
  • Ecmascript(ES)标准
  • 酸枣病虫害智能化防控系统的探索与实践,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建枣类作物种植场景下酸枣病虫害智能检测识别系统
  • 第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)
  • go语言Map详解
  • 深度学习简历面试知识——transformer、VGGish、K-means、峰值检测
  • SQL编程题复习(24/9/20)
  • VM虚拟机使用的镜像文件下载
  • Linux:虚拟文件系统/proc和self进程
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第六集:制作小骑士完整的跳跃落地行为
  • 力扣(leetcode)每日一题 LCR 187 破冰游戏(还是考的约瑟夫环)
  • F28335中断系统
  • 第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
  • Linux线程同步—竞态条件与互斥锁、读写锁(C语言)
  • PLC通信协议的转化
  • xhs 小红书 x-s web 分析
  • 如何下载ComfyUI开发版
  • SpringBoot开发-数据加密
  • Vue3DevTools7是如何在vscode定位指定文件位置的?
  • 浅谈穷举法
  • 【C/C++语言系列】实现单例模式
  • 在PyQt的QLabel控件上显示图像指南