systemV信号量与消息队列

目录

引言

ipc简介

ipc在kernel的管理机制(简介)

信号量

理解信号量

原子

结论

mmap

消息队列

接口


引言

在复杂的软件系统中,进程间的协调和通信是确保系统高效、稳定运行的关键。System V是一套历史悠久且功能强大的进程间通信(IPC)机制,它为Unix和类Unix操作系统提供了多种通信手段,其中包括信号量和消息队列。这两种机制各自以其独特的方式,为进程间的同步和数据传递提供了可靠的解决方案。本文将引入System V信号量和消息队列的概念,探讨它们在进程同步和通信中的作用,以及它们在现代软件开发中的应用场景和优势。通过深入了解这些经典IPC工具的工作原理和使用方法,开发者能够更好地构建高并发、高可靠性的系统应用。

ipc简介

IPC(Inter-Process Communication,进程间通信)是在多任务操作系统中,不同进程之间进行数据交换和同步的一种机制。在Linux系统中,有多种IPC方法,每种方法都有其特定的用途和优缺点。

以下是一些常见的Linux IPC机制:

管道(Pipes)和命名管道(FIFOs):

无名管道:只允许具有亲缘关系的进程之间通信,如父子进程。

命名管道:也称为FIFO,可以在任意两个进程之间进行通信。

信号(Signals):

信号是一种较为简单的通信方式,用于通知接收进程某个事件已经发生。

消息队列(Message Queues):

消息队列允许一个或多个进程写入或读取数据,这些数据以消息为单位进行传输。

共享内存(Shared Memory):

允许多个进程共享一段内存区域,是最快的IPC方式,但需要同步机制(如信号量)来避免竞态条件。

信号量(Semaphores):

主要用于同步,确保多个进程可以安全地访问共享资源。

套接字(Sockets):

提供了在不同主机上的进程间进行双向通信的能力,支持网络通信。

每种IPC机制都有其适用场景和限制:

管道和命名管道:适合于字节流数据的简单通信。

信号:通常用于通知,而不是传输大量数据。

消息队列:提供了有序、可靠的数据传输,但速度不如共享内存。

共享内存:适用于需要高速数据交换的场景,但需要谨慎处理同步问题。

信号量:用于同步,而不是数据传输。

套接字:适合于分布式系统中的进程间通信。

选择合适的IPC机制取决于具体的应用需求,包括通信的数据量、通信频率、通信的可靠性要求以及通信双方的关系等因素。在使用这些机制时,需要考虑同步、互斥、死锁和竞态条件等问题,以确保数据的一致性和系统的稳定性。

ipc在kernel的管理机制(简介)

每一个systemV的数据结构(信号量、共享内存、消息队列),都有一个shmid_ds的数据结构去描述他的属性,这些被组织在一个队列中,可以通过指针强转解引用去找到perm属性中的key,从而找到特定的数据结构。

信号量

基础知识

这就是因为多个进程共同抢夺唯一当临界资源--显示器。

因为显示器也是一种共享资源,但是没有被设置为临界资源。

理解信号量

我们可以引入一个计数器cnt--,表示申请资源。

核心:先去申请信号量去预订资源

这是因为进程在执行的时候可以在任意时刻被切换。

原子

技术角度:只有一条汇编语句,就是原子的

结论

多个信号量和信号量是几是不同的概念。

mmap

在使用 mmap 处理大文件时,你首先需要映射文件,然后就可以通过访问映射后的内存区域来间接访问文件内容,而不是使用传统的文件读写接口(如 readwritefreadfwrite 等)。这种方式可以显著提高大文件操作的效率。

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[]) {int fd;void *map;struct stat sb;fd = open(argv[1], O_RDONLY);if (fd == -1) {perror("Error opening file");exit(EXIT_FAILURE);}if (fstat(fd, &sb) == -1) {  /* To obtain file size */perror("Error fstat");exit(EXIT_FAILURE);}map = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);if (map == MAP_FAILED) {perror("Error mmap");exit(EXIT_FAILURE);}// 使用映射的内存区域...if (munmap(map, sb.st_size) == -1) {perror("Error munmap");exit(EXIT_FAILURE);}close(fd);return 0;
}

消息队列

消息队列(Message Queue)是一种进程间通信(IPC)机制,它允许一个或多个进程(生产者)将消息发送到一个队列中,而其他进程(消费者)可以从中读取这些消息。消息队列提供了一种异步的通信方式,即发送消息的进程在发送消息后可以继续执行,不需要等待接收进程确认接收。
以下是消息队列的一些关键特点和解释:
1.消息存储:
消息队列由内核维护,它存储了一系列的消息。每个消息通常包含一个类型和数据部分,数据部分可以是任意长度的字节序列。
2. 异步通信:生产者和消费者不需要同时在线。生产者可以在任何时间点将消息放入队列,消费者可以在任何时间点从队列中取出消息.
3.消息顺序:消息队列通常保证消息的顺序,即先入先出(FIFO)。第一个被放入队列的消息将是第一个被取出的消息。
4.系统资源:消息队列是系统资源,通常由操作系统内核管理。它们有唯一的标识符,可以通过这个标识符被进程访问。
5.同步和互斥:内核通常会处理消息队列的同步和互斥问题,确保多个进程可以安全地访问消息队列而不会发生冲突。

6.消息传递模式:
点对点模式:一个消息队列只能由一个消费者接收,即消息从生产者发送到单个消费者
。发布/订阅模式:多个消费者可以订阅同一个消息队列,每个消费者都可以接收到队列中的消息。

消息队列的使用步骤通常包括以下几个阶段:
创建消息队列:在使用消息队列之前,需要创建一个消息队列,并获取其标识符。
发送消息:生产者进程将消息发送到消息队列中。如果队列已满,发送操作可能会阻塞,直到队列中有空间。
接收消息:消费者进程从消息队列中读取消息。如果队列为空,接收操作可能会阻塞,直到队列中有消息。
删除消息队列:当消息队列不再使用时,可以将其删除以释放系统资源。

允许不同的进程向内核发送数据块。

接口

由于是systemV标准,所以接口十分类似共享内存。

IPC 资源必须删除,否则不会自动清除,除非重启,所以 system V IPC 资源的生命周期随内核
注意,除了systemV标准,还有POSIX 标准。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【CKS最新模拟真题】Falco 的运行时安全性

系列文章目录 【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中 文章目录 系列文章目录参考地址一、TASK二、解题过程1、问题一解题2、问题二解题 参考地址 CKS考试允许打开falco的地址 https://falco.org/docs/reference/rules/supported-fields/ 一、TASK …

Altium Designer学习笔记 32 DRC检查_丝印调整

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…

流量地球(Java Python JS C++ C )

题目描述 流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。 初始状态下所有的发动机都是未启动状态;发动机启动的方式分为”手动启动"和”关联启动"两种方式;如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被”关联启动”…

Milvus向量数据库04-Pipelines搭建RAG应用

Milvus向量数据库04-Pipelines搭建RAG应用 Zilliz Cloud Pipelines 可以将文档、文本片段和图像等非结构化数据转换成可搜索的向量并存储在 Collection 中。本文将介绍 Zilliz Cloud Pipelines 的三种主要类型并提供示例代码&#xff0c;展示如何使用 Pipelines 搭建 RAG 应用。…

离线写博客(失败) - 用Markdown来离线写博客

因为想控制一下用网&#xff0c;但是又有写博客的需求&#xff0c;所以想研究一下离线写博客。 我看CSDN上面好像有很多介绍&#xff0c;Windows Live Writer 啦&#xff0c;Markdown啦&#xff0c;还有一些其他的&#xff0c;我看了一下&#xff0c;好像 Markdown还有点儿靠谱…

【洛谷】B3844 [GESP样题 二级] 画正方形(详细注释)

#include <iostream> using namespace std; int main() {//声明一个整型变量n&#xff0c;用于接收输入的数值&#xff0c;该数值将决定后续输出图案的行数和列数int n; cin >> n;//声明两个整型变量i和j&#xff0c;分别用作外层循环和内层循环的计数器int i, j;/…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

番茄社区双端视频APP源码_内附安装教程

新版视频源码|类似番茄APP视频付费软件APP源码教程 番茄社区双端视频APP源码&#xff0c;带安装教程&#xff0c;源码非组件&#xff0c;短视频、图片、交流、讨论、电影、电视剧。 没有什么问题宝塔就可以搭建&#xff0c;采集方面是火车头可以自己写规则&#xff01;

Onchain 正在蚕食 Offchain

目录 未来在链上 价值创造 技术加速 机构采用 小队&#xff1a;加速链上经济 我们正在进入一个代码就是货币、信任被编程、全球接入打破传统经济界限的时代。这种新兴模式就是我们所说的链上经济。 在此领域&#xff0c;Solana 因其在基础设施和应用程序方面的持续创新而脱颖而…

【LeetCode】80.删除有序数组中的重复项II

题目链接&#xff1a; 80.删除有序数组中的重复项II 题目描述&#xff1a; 解题思路&#xff1a; 按照题目中要求&#xff0c;必须在原来数组中进行修改&#xff0c;并且在O(1)额外空间条件下完成。因此我们可以使用双指针算法&#xff0c;算法具体流程如下&#xff1a; 如…

ORB-SLAM2 ---- 词袋模型BOW

文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道&#xff0c;噪声的影响是不可消除的&#xff0c;而上一帧的误差不可避免的…

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…

php项目的sdk封装成composer包的创建与发版

将一个 PHP 项目的 SDK 封装成 Composer 包并发布的过程大致可以分为以下几个步骤。这个过程涉及到创建一个符合 Composer 规范的包&#xff0c;配置相关信息&#xff0c;并将其发布到 Packagist 或其他 Composer 仓库。以下是详细的步骤&#xff1a; ### 1. 准备 PHP SDK 项目…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…

Tomcat项目本地部署

今天分享一下如何在本地&#xff0c;不依赖于idea部署聚合项目&#xff0c;以我做过的哈米音乐项目为例&#xff0c;项目结构如下&#xff1a; ham-core模块为公共模块&#xff0c;我们只需将另外三个模块&#xff1a;前台、后台、文件服务器打包&#xff0c;将打好的jar、war包…

进入保护模式

Intel CPU启动的时候是16位(实模式), 但是我们要工作在32位模式下 实模式下没有任何保护措施, 别人可能通过给数据段寄存器赋值上代码段地址, 然后来改变代码段的内容, 保护模式访问内容会检查权限之类的, 也会检查程序访问的内存范围是不是超了, 我们这个操作系统不会利用保…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…