Linux消息队列信号量(了解)

消息队列

要实现进程间通信我们必须得让不同的进程看到同一份资源, 根据这个资源的不同(文件缓冲区, 内存块, 队列) 我们将通信方式分为管道,共享内存,以及我们接下来要讲的消息队列。

消息队列的原理就是让不同的进程能看到同一个队列, 每当想发送数据就将带类型的数据块(这是为了区分消息发送给谁)链入队列中, 这样每个进程都能从队列中拿到发送给自己的数据。
在这里插入图片描述
这种通信方式和之前将的共享内存一样是system V标准

消息队列相关的接口

创建消息队列
在这里插入图片描述
控制消息队列
在这里插入图片描述
在这里插入图片描述
发送消息到消息队列, 注意我们需要发送的是类似下面那张图的结构体

从消息队列中接收消息

在这里插入图片描述

IPC在内核中的数据结构设计

在操作系统中, 所有的IPC资源, 都是在整合进程操作系统的IPC模块中

我们要管理消息队列, 共享内存, 信号量, 其实就是管理对应的数据结构
在这里插入图片描述

所以现在的问题就是我们该如何把这些数据结构管理起来呢?

在操作系统当中使用数组管理起来的。
在这里插入图片描述
我们在创建共享内存的时候, 操作系统就会为我们创建出他的_ds结构体在这里插入图片描述
我们就让数组的某个地方, 指向这个结构体的起始位置
在这里插入图片描述
后来, 如果我们要创建消息队列, 虽然他们的_ds有所不同, 但是他们的第一个数据类型是一样的, 所以同样可以将他的起始地址填入数组中
在这里插入图片描述
对于信号量也同理。

从此往后, 我要管理操作系统中的IPC资源就转化成了对该数组进行增删查改。

而我们要查找某个资源的时候只需要根据提供的key, 然后遍历数组,在指向的第一个结构体中去找到这个key

在这里插入图片描述
而这个XXXid(例如 shmid) 就是这个玩意的数组下标

我们可以发现, 其实这里也是用c语言实现的多态。

信号量

在这里插入图片描述
当我们的A正在写入, 写入了一部分还没写完就被b拿走了,导致发送和接受的信息都不完整 — 数据不一致问题

管道不会有这种问题, 因为管道有同步与互斥机制, 而共享内存是没有保护机制的。

  1. A B 看到的是同一份资源(共享资源), 如果不加以保护就会导致数据不一致问题。
  2. 加锁 – 互斥访问 – 当我读写的时候不允许别人打扰 也就是 任何时刻都只允许一个执行流访问共享资源 – 互斥
  3. 共享的, 任何时刻只允许一个执行流访问(执行访问代码)的资源他就是一个 – 临界资源 例如(管道) – 一般是内存空间。
  4. 并不是所有的代码都会访问临界资源, 例如100行代码可能只有几行在进行拷贝等操作需要访问临界资源, 我们把访问临界资源的代码称为临界区

解释一个现象: 多进程,多线程, 并发打印的时候 例如打印"hello 1234"
但是显示器上的消息:
1 错乱的
2 混乱的 (可能有的消息没有被完全打印出来)
3 和命令行混在一起
我们想显示器打印数据本质上是往显示器文件里写入数据, 所以我们会先写入显示器文佳的缓冲区内,然后操作系统再把内容刷新到显示器上我们才看到对应的内容,进程要往同一个显示器打印内容, 需要看到同一个显示器文件, 所以显示器文件在这里其实是一个共享资源, 由于没有对他进行保护, 所以导致了数据不一致问题

理解信号量

信号量的本质就是一把计数器, 类似(不是等于)int cnt = n
他是用于描述临界资源中资源数量的多少!
在这里插入图片描述

在这里插入图片描述
为了防止n + 1 个执行流去访问 n 个资源 而导致多个执行流访问同一个资源 我们就有了一个计数器 。

1 申请成功(计数器不为0) 就代表我具有访问资源的权限了。
2 申请了计数器资源, 我当前访问我要的资源了吗? 没有。 申请了计数器资源的本质是对资源的预定机制
3 计数器可以有效保证进入共享资源的执行流的数量。
4 所以每一个执行流想访问共享资源的时候, 不是直接去访问, 而是先申请计数器资源。就比如看电影要先买票。

这个计数器我们就称为信号量

而如果信号量为1, 也就代表只有一个执行流能访问这个临界资源
我们把值只能为1/0两态的计数器叫做二元信号量 – 他的本质就是一个锁。
计数器为1 本质就是不要把临界资源当做很多块了, 而是当做一个整体来使用。
在这里插入图片描述
那么对一个整数做--操作是安全的嘛?
不是
在这里插入图片描述
所以在信号量这里,对于他的操作是进行保护了的。
在这里插入图片描述

结论:
在这里插入图片描述

信号量对应的接口

申请信号量
在这里插入图片描述
第二个参数表示要申请几个信号量, 注意多个信号量和信号量是几不是一个概念

控制信号量、
根据cmd的不同对信号量进行不同的操作 比如 设置, 删除, 获取属性
在这里插入图片描述

设置信号量
在这里插入图片描述

其中sembuf是需要我们自己定义的结构体, 他的结构是这样的
在这里插入图片描述
如果我们只需要一个信号量第一个参数就传0 就相当于这个信号量在数组里的下标
sem_op 我们一般设置为1/-1 1表示对信号量实行++,也就是p操作-1表示对信号量进行-- ,也就是v操作

在这里插入图片描述

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

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

相关文章

【学习笔记二十七】EWM存储类型控制

一、EWM存储类型控制概述 Storage control 是用来决定仓库产品移动时所需要的流程步骤。它的目的是用来处理基于仓库物理布局及仓库流程所要求的复杂的上架和下架流程步骤。 仓库里常见的操作步骤有:Picking、Packing、Staging、Loading、Putaway、Unloading、Counting、Quali…

【C语言】联合体详解

目录 1.联合体的声明 2.联合体的特点 3.相同成员的结构体和联合体对比 4.联合体大小的计算 1.联合体的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。 联合体的特点是所…

操作系统:进程间通信 | System V IPC

目录 前言: 1.共享内存 1.1.什么是共享内存 1.2.共享内存使用接口 shmget函数 shmat函数 shmdt函数 shmctl函数 2.共享内存实现通信 2.1.代码实现 comm.hpp server,cpp client.cpp 2.2.共享内存的缺点 2.3.实现通信的同步化 2.4共享内存通信的优势 3.…

Vitis HLS 学习笔记--HLS入门示例集合-目录

目录 1. 示例集合概述 2. Interface 接口 2.1 Aggregation_Disaggregation 聚合与解聚 2.1.1 aggregation_of_m_axi_ports 2.1.2 aggregation_of_nested_structs 2.1.3 aggregation_of_struct 2.1.4 auto_disaggregation_of_struct 2.1.5 disaggregation_of_axis_port …

游戏工作室为什么要使用海外住宅IP防封?

当谈到游戏工作室时,它们通常以多开游戏账号来获取收益为主要目标。这种商业模式在游戏产业中已经成为一个独特而且颇具潜力的领域。然而,随之而来的是防封问题,特别是当游戏工作室试图通过多开账号来赚取更多收益时。因此,我们有…

Navicat连接SQLSever报错:[08001] MicrosoftTCP Provider 远程主机强迫关闭了一个现有的连接

Navicat连接SQLSever报错:[08001] [Microsoft][SQL Server Native Client 10.0]TCP Provider: 远程主机强迫关闭了一个现有的连接 问题分析 旧版的MSSQL 如果不是最新版的,可以去这安装以下即可。 最新版的MSSQL 如果是安装最新版的MSSQL连接不上很正…

Kubernetes 的未来:通过生成式 AI 实现的潜在改进

Kubernetes 是一个用于自动化部署、扩展和管理容器化应用程序的开源平台,它彻底改变了 IT 行业。然而,与所有创新技术一样,它不断寻求改进以提高效率、可用性和功能。生成式人工智能(Generative AI)是一个有望取得改进…

C++:匿名对象

在C中,匿名对象是指在不分配给定变量名称的情况下创建的临时对象。这些对象通常用于传递参数给函数、作为函数的返回值或者在表达式中使用。 创建匿名对象 在C中,您可以使用类的构造函数来创建匿名对象。例如: MyClass(); // 创建一个匿名…

终于有人把“Linux云计算路线”整理出来了,收藏起来,随时查看

一,计算机硬件 二,计算机网络 三,Linux系统管理 四,构建Linux服务系统,数据库,程序及Web服务 五,消息队列,web集群,系统及软件优化,智能化监控,海…

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色。 先看效果图: 在CSS中,你可以使用border属性或者background属性来画一条虚线。以下是两种常见的方法: 方法一:使用border属性 你可以设置一个元素的border…

4.25日学习记录

[HZNUCTF 2023 preliminary]ppppop 对于php反序列化,在之前的学习中有过了解,但是对于序列化字符串的格式不是很了解,刚好接触这题,可以了解一下 序列化字符串的格式: 布尔型(bool)b&#xf…

036——完善编译框架和注释并选择开源协议

目录 小总结 编译框架完善 代码风格 开源协议选择 小总结 经过两个月的努力现在已经写了457MB的代码了 . ├── board │ ├── Linux │ │ └── 4_9_88 │ │ └── ARM32 │ │ └── 100ask │ │ └── imx6ull_mi…

10.JAVAEE之网络编程

1.网络编程 通过网络,让两个主机之间能够进行通信 >基于这样的通信来完成一定的功能进行网络编程的时候,需要操作系统给咱们提供一组 AP1, 通过这些 API才能完成编程(API 可以认为是 应用层 和 传输层 之间交互的路径)(API:Socket API相当…

简单案例验证说明 双亲委派机制

双亲委派介绍 双亲委派机制(Parent Delegation Mechanism)是Java中的一种类加载机制。在Java中,类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时,它会先将该请求委派给它的父…

aysnc-await的用法

aysnc-await是promise的一种特殊语法,它可以更简洁的得到promise aysnc function aysnc 放在函数前定义函数,它规定了这个函数的返回值一定为promise, // 通过new新建一个promise(旧) // let p new Promise(function(resolve,reject){ //…

可搜索加密:保护隐私的搜索技术

在信息化、数字化快速发展的今天,数据的安全性和隐私性已成为公众关注的焦点。随着云计算、大数据等技术的广泛应用,数据共享与协同工作日益普遍,但如何在确保数据安全性的前提下,实现数据的快速、高效检索,成为了一个…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如: EXPLAIN SELECT * FROM test 执行结果: 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

LLama的激活函数SwiGLU 解释

目录 Swish激活函数 1. Swish函数公式 LLaMA模型中的激活函数 1. SwiGLU激活函数 2. SwiGLU激活函数的表达式 3. SwiGLU激活函数的优势 Swish激活函数 Swish是一种激活函数,其计算公式如下: 1. Swish函数公式 Swish(x) x * sigmoid(x) 其中&am…

基于CANoe从零创建以太网诊断工程(2)—— TCP/IP Stack 配置的三种选项

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

Confluence 快捷键大揭秘:提高效率的小窍门

使用 Confluence 快捷键的好处有: 1.提高工作效率; 2.更流畅地进行编辑、导航和管理操作; 3.减少误操作; 4.展现专业水平。 更多精彩内容: 成为 Jira 大师:效率达人的必备秘诀 Jira Cloud 项目管理专栏 PMO…