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

server/2025/1/31 12:03:21/

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方式,适合大数据量传输。
  • 信号量集:用于解决共享内存的同步问题。
  • 消息队列:适合进程间传递结构化消息。

http://www.ppmy.cn/server/163792.html

相关文章

Excel分区间统计分析(等步长、不等步长、多维度)

在数据分析过程中,可能会需要统计不同数据区间的人数、某个数据区间的平均值或者进行分组区间统计,本文从excel函数到数据透视表的方法,从简单需求到复杂需求,采用不同的方法进行讲解,尤其是通过数据透视表的强大功能大…

如何利用AI工具来进行数据分析

利用AI工具进行数据分析可以显著提高效率和准确性,以下是详细步骤和方法: 1. 明确分析目标 在开始数据分析之前,首先需要明确分析的目标和问题。这包括确定需要解决的问题、期望的见解或结果,以及选择合适的AI工具和方法。 2. …

计算机毕业设计Python+CNN卷积神经网络小说推荐系统 K-means聚类推荐算法 深度学习 Kears 小说数据分析 可视化 Scrapy爬虫 协同过滤

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

题海拾贝:二叉树遍历

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Redis存储③Redis基本命令+内部编号和架构

目录 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 1.2 set 和 get 命令 2. 基本全局命令 2.1 keys 2.2 exists 2.3 del 2.4 expire 2.5 ttl 2.6 type 3. 数据结构和内部编码 4. 单线程架构 本篇完。 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 根据上篇…

国产SiC碳化硅功率器件技术成为服务器电源升级的核心引擎

在服务器电源应用中&#xff0c;国产650V碳化硅&#xff08;SiC&#xff09;MOSFET逐步取代传统超结&#xff08;Super Junction, SJ&#xff09;MOSFET&#xff0c;其核心驱动力源于SiC材料在效率、功率密度、可靠性和长期经济性上的显著优势&#xff0c;叠加产业链成熟与政策…

leetcode 面试经典 150 题:简化路径

链接简化路径题序号71题型字符串解法栈难度中等熟练度✅✅✅ 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下…

C# volatile 使用详解

总目录 前言 在多线程编程中&#xff0c;确保线程之间的正确同步和可见性是一个关键挑战。C# 提供了多种机制来处理这些挑战&#xff0c;其中之一就是 volatile 关键字。它用于指示编译器和运行时环境不要对特定变量进行某些优化&#xff0c;以保证该变量的读写操作是线程安全…