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

10.共享内存 信号量集 消息队列

10.共享内存 信号量集 消息队列

      • **1. IPC对象操作通用框架**
      • **2. 共享内存(Shared Memory)**
      • **3. 信号量集(Semaphore)**
      • **4. 消息队列(Message Queue)**
      • **5. 练习与作业**
      • **6. 总结**


1. IPC对象操作通用框架

  • 操作流程
    1. 生成唯一键值(ftok
      key_t ftok(const char *pathname, int proj_id);
      
      • 功能:通过路径和项目ID生成唯一键值。
      • 参数:
        • pathname:文件路径。
        • proj_id:项目ID(通常为ASCII字符)。
      • 返回值:成功返回键值,失败返回-1
    2. 申请IPC对象
      • 共享内存:shmget
      • 信号量集:semget
      • 消息队列:msgget
    3. 操作IPC对象
      • 共享内存:shmatshmdt
      • 信号量集:semop
      • 消息队列:msgsndmsgrcv
    4. 删除IPC对象
      • 共享内存:shmctl
      • 信号量集:semctl
      • 消息队列:msgctl

2. 共享内存(Shared Memory)

  • 特性
    • 效率最高的进程间通信方式。
    • 多个进程可以共享同一块内存区域。
  • 操作流程
    1. 申请共享内存
      int shmget(key_t key, size_t size, int shmflg);
      
      • 功能:申请共享内存。
      • 参数:
        • key:唯一键值。
        • size:共享内存大小。
        • shmflg:权限标志(如IPC_CREAT|0666)。
      • 返回值:成功返回共享内存ID,失败返回-1
    2. 映射共享内存
      void *shmat(int shmid, const void *shmaddr, int shmflg);
      
      • 功能:将共享内存映射到进程地址空间。
      • 参数:
        • shmid:共享内存ID。
        • shmaddr:映射地址(通常为NULL,由系统分配)。
        • shmflg:映射标志(如0表示读写,SHM_RDONLY表示只读)。
      • 返回值:成功返回映射地址,失败返回(void*)-1
    3. 读写共享内存
      • 使用memcpystrcpy等函数直接操作映射地址。
    4. 撤销映射
      int shmdt(const void *shmaddr);
      
      • 功能:断开共享内存映射。
      • 参数:shmaddr:映射地址。
      • 返回值:成功返回0,失败返回-1
    5. 删除共享内存
      int shmctl(int shmid, int cmd, struct shmid_ds *buf);
      
      • 功能:删除共享内存。
      • 参数:
        • shmid:共享内存ID。
        • cmd:命令(如IPC_RMID表示删除)。
        • buf:共享内存信息结构体(通常为NULL)。
      • 返回值:成功返回0,失败返回-1

3. 信号量集(Semaphore)

  • 特性
    • 用于解决共享内存的临界资源访问问题。
    • 通过P(sem_wait)和V(sem_post)操作实现同步。
  • 操作流程
    1. 申请信号量集
      int semget(key_t key, int nsems, int semflg);
      
      • 功能:申请信号量集。
      • 参数:
        • key:唯一键值。
        • nsems:信号量数量。
        • semflg:权限标志(如IPC_CREAT|0666)。
      • 返回值:成功返回信号量集ID,失败返回-1
    2. 初始化信号量
      • 使用semctl初始化信号量值。
    3. P/V操作
      int semop(int semid, struct sembuf *sops, unsigned nsops);
      
      • 功能:执行P/V操作。
      • 参数:
        • semid:信号量集ID。
        • sops:操作结构体数组。
        • nsops:操作数量。
      • 返回值:成功返回0,失败返回-1
    4. 删除信号量集
      int semctl(int semid, int semnum, int cmd, ...);
      
      • 功能:删除信号量集。
      • 参数:
        • semid:信号量集ID。
        • semnum:信号量编号。
        • cmd:命令(如IPC_RMID表示删除)。
      • 返回值:成功返回0,失败返回-1

4. 消息队列(Message Queue)

  • 特性
    • 用于进程间传递消息。
    • 消息以队列形式存储,先进先出(FIFO)。
  • 操作流程
    1. 申请消息队列
      int msgget(key_t key, int msgflg);
      
      • 功能:申请消息队列。
      • 参数:
        • key:唯一键值。
        • msgflg:权限标志(如IPC_CREAT|0666)。
      • 返回值:成功返回消息队列ID,失败返回-1
    2. 发送消息
      int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
      
      • 功能:发送消息。
      • 参数:
        • msqid:消息队列ID。
        • msgp:消息结构体指针。
        • msgsz:消息大小。
        • msgflg:发送标志(如0表示阻塞)。
      • 返回值:成功返回0,失败返回-1
    3. 接收消息
      ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
      
      • 功能:接收消息。
      • 参数:
        • msqid:消息队列ID。
        • msgp:消息结构体指针。
        • msgsz:消息大小。
        • msgtyp:消息类型。
        • msgflg:接收标志(如0表示阻塞)。
      • 返回值:成功返回消息大小,失败返回-1
    4. 删除消息队列
      int msgctl(int msqid, int cmd, struct msqid_ds *buf);
      
      • 功能:删除消息队列。
      • 参数:
        • msqid:消息队列ID。
        • cmd:命令(如IPC_RMID表示删除)。
        • buf:消息队列信息结构体(通常为NULL)。
      • 返回值:成功返回0,失败返回-1

5. 练习与作业

  • 练习1:使用共享内存完成两个进程间的通信,共享一个数字。
  • 练习2:设计两个进程,进程1获取用户输入并写入共享内存,进程2读取共享内存并打印输出,遇到exit时退出。
  • 作业1:封装信号量的P/V操作函数:
    int my_sem_wait(int id, int sem);
    int my_sem_post(int id, int sem);
    
  • 作业2:使用信号量集解决共享内存的临界资源访问问题。

6. 总结

  • 共享内存:效率最高的IPC方式,适合大数据量传输。
  • 信号量集:用于解决共享内存的同步问题。
  • 消息队列:适合进程间传递结构化消息。

相关文章:

10.共享内存 信号量集 消息队列

10.共享内存 信号量集 消息队列 **1. IPC对象操作通用框架****2. 共享内存(Shared Memory)****3. 信号量集(Semaphore)****4. 消息队列(Message Queue)****5. 练习与作业****6. 总结** 1. IPC对象操作通用框…...

每日 Java 面试题分享【第 17 天】

欢迎来到每日 Java 面试题分享栏目! 订阅专栏,不错过每一天的练习 今日分享 3 道面试题目! 评论区复述一遍印象更深刻噢~ 目录 问题一:Java 中的访问修饰符有哪些?问题二:Java 中静态方法和实例方法的区…...

【懒删除堆】力扣2349. 设计数字容器系统

设计一个数字容器系统,可以实现以下功能: 在系统中给定下标处 插入 或者 替换 一个数字。 返回 系统中给定数字的最小下标。 请你实现一个 NumberContainers 类: NumberContainers() 初始化数字容器系统。 void change(int index, int numb…...

【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用

论文信息 标题: VOLO: Vision Outlooker for Visual Recognition作者: Li Yuan, Qibin Hou, Zihang Jiang, Jiashi Feng, Shuicheng Yan代码链接: https://github.com/sail-sg/volo论文链接: https://arxiv.org/pdf/2106.13112 创新点 前景注意力机制: VOLO引入了一种称为“…...

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…...

Vue 组件开发:构建高效可复用的前端界面要素

1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…...

【Python】深入探索Python元类:动态生成类与对象的艺术

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 元类是Python中一个高级且强大的特性,允许开发者在类的创建过程中插入自定义逻辑,从而动态生成类和对象。本文将全面介绍Python中的元类概…...

Spring Boot + Facade Pattern : 通过统一接口简化多模块业务

文章目录 Pre概述在编程中,外观模式是如何工作的?外观设计模式 UML 类图外观类和子系统的关系优点案例外观模式在复杂业务中的应用实战运用1. 项目搭建与基础配置2. 构建子系统组件航班服务酒店服务旅游套餐服务 3. 创建外观类4. 在 Controller 中使用外…...

在Linux系统上安装.NET

测试系统:openKylin(开放麒麟) 1.确定系统和架构信息: 打开终端(Ctrl Alt T),输入cat /etc/os-release查看系统版本相关信息。 输入uname -m查看系统架构。确保你的系统和架构符合.NET 的要求,如果架构…...

OpenAI Operator:AI Agent 大战的号角,从 “工具” 到 “助手” 的飞跃

想尝试不同的 AI 模型?不必到处寻找!chatTools 为您集成了 o1、GPT4o、Claude 和 Gemini 等多种选择,一个平台解决您的所有 AI 需求。现在就来体验吧! 各位 AI 爱好者们,今天我们来聊聊 OpenAI 的最新力作——Operator…...

AI大模型开发原理篇-9:GPT模型的概念和基本结构

基本概念 生成式预训练模型 GPT(Generative Pre-trained Transformer)模型 是由 OpenAI 开发的基于 Transformer 架构的自然语言处理(NLP)模型,专门用于文本生成任务。它的设计理念在于通过大规模的预训练来学习语言模…...

Java Swing 基础组件详解 [论文投稿-第四届智能系统、通信与计算机网络]

大会官网:www.icisccn.net Java Swing 是一个功能强大的 GUI 工具包,提供了丰富的组件库用于构建跨平台的桌面应用程序。本文将详细讲解 Swing 的基础组件,包括其作用、使用方法以及示例代码,帮助你快速掌握 Swing 的核心知识。 一…...

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事,于是研究起深度学习开发工具链的配置和安装,之前欲与天公试比高,尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境,最后惨败,沦为笑柄,痛定思痛,这次直接和…...

【letta】The Letta Platform LETTA平台

The Letta Platform LETTA平台 The Letta Platform LETTA平台开源网站2023年的论文 论文:MemGPT Towards LLMs as Operating Systems Letta enables developers to build and deploy stateful AI agents - agents that maintain memory and context across long-running conve…...

想品客老师的第九天:原型和继承

原型与继承前置看这里 原型 原型都了解了,但是不是所有对象都有对象原型 let obj1 {}console.log(obj1)let obj2 Object.create(null, {name: {value: 荷叶饭}})console.log(obj2) obj2为什么没有对象原型?obj2是完全的数据字典对象,没有…...

Time Constant | RC、RL 和 RLC 电路中的时间常数

注:本文为 “Time Constant” 相关文章合辑。 机翻,未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 💡 Key learnings: 关键学习点: Time Constant Definition: The time constant (τ) is define…...

原码、反码、补码以及lowbit运算

原码、反码、补码以及lowbit运算 原码: 可以用来计算正数加减,正数的原码、反码、补码都一样。 第一位为符号位,符号位0为正数,1为负数(32位字符,这里用4位来举例子,后面皆是用4位来举例子,其…...

芯片AI深度实战:实战篇之vim chat

利用vim-ollama这个vim插件,可以在vim内和本地大模型聊天。 系列文章: 芯片AI深度实战:基础篇之Ollama-CSDN博客 芯片AI深度实战:基础篇之langchain-CSDN博客 芯片AI深度实战:实战篇之vim chat-CSDN博客 芯片AI深度…...

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...

Spring Boot 日志:项目的“行车记录仪”

一、什么是Spring Boot日志 (一)日志引入 在正式介绍日志之前,我们先来看看上篇文章中(Spring Boot 配置文件)中的验证码功能的一个代码片段: 这是一段校验用户输入的验证码是否正确的后端代码&#xff0c…...

幸运数字——蓝桥杯

1.问题描述 哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数,因为 (126)10mod(126)0;126 也是八进制下的哈沙德数,因为 (126)10(176)8,(126)10​mod(176)…...

Deepseek本地部署(ollama+open-webui)

ollama 首先是安装ollama,这个非常简单 https://ollama.com/ 下载安装即可 open-webui 这个是为了提供一个ui,毕竟我们也不想在cmd和模型交互,很不方便。 第一,需要安装python3.11,必须是3.11(其他版…...

【QT】 控件 -- 显示类

🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4:习题5: 知识点 C的STL提供已经封装好的容器vector,也可叫做可变长的数组,vector底层就是自动扩容的顺序表,其中的增删查改已经封装好 创建 const int N30; vecto…...

指针空值——nullptr(C++11)——提升指针安全性的利器

C11引入的nullptr是对指针空值的正式支持,它提供了比传统NULL指针更加安全和明确的指针空值表示方式。在C语言中,指针操作是非常基础且常见的,而如何安全地处理指针空值,一直是开发者关注的重要问题。本文将详细讲解nullptr的引入…...

鸿蒙开发黑科技“stack叠层”替代customdialog

前一篇提到的问题,本篇博文提出了一个解决方案: arkui-x LongPressGesture触发customdialog踩坑记录-CSDN博客 前一段时间遇到的这个问题,通过排除法观察,锁定为customdialog组件有bug,极为容易挂死。不论如何调整使用方法,都还是会触发挂死。 反馈给arkui团队,说是在…...

小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

闲鱼上收了一台CR6606和一台CR6609, 一直没时间研究, 趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT,双核880MHz内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB闪存: F59L1G81MB, 128MB无线基带芯片(BB): T7905DAN无线射频芯片(RF): MT7975DN无外置F…...

SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门

前言 在分布式系统中,雪崩效应(Avalanche Effect)是一种常见的故障现象,通常发生在系统中某个组件出现故障时,导致其他组件级联失败,最终引发整个系统的崩溃。为了有效应对雪崩效应,服务保护方…...

Web-3.0(Solidity)ERC-20

🚀 发行自己的加密货币(ERC-20 代币) 你可以使用 Solidity 编写 ERC-20 智能合约 来发行自己的加密货币,然后部署到 以太坊(Ethereum) 或 BNB/Polygon 等 EVM 兼容链。 📌 1. ERC-20 代币是什么…...

大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)

大数据相关职位介绍之一 随着大数据、人工智能(AI)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…...