共享内存
什么是共享内存?
共享内存就是不同进程间可以直接进行通信的一块区域。
怎么使用共享内存?
主要在不同进程间对内存段进行映射实现内存共享。这个方式也是IPC(进程间通信)最快的。
在创建共享内存之前,需要通过一个key唯一标识这个共享内存。该key可以根据文件系统上的一个文件的inode随机生成。除此以外,还需要指定一个size。通过下面的函数来创建共享内存
1 | int shmget(key_t key, size_t size, int shmflag); |
创建好共享内存后,需要将该共享内存映射到进程的虚拟地址空间中。
1 | void *shmat( int shm_id, const void *addr, int shmflg); |
shm_id就是创建的共享内存的id,addr就是指定映射在某个地方。如果不指定,内核会自动选择一个地址,作为返回值返回。当共享内存使用完毕后,可以通过shmdt解除它到虚拟内存的映射。
信号量
谈到了共享内存,不可避免地会谈到信号量。通过信号量的使用,才能正确的,安全地操作共享内存。在Linux中,信号量是通过集合的形式存在的,同样需要一个key来唯一标识这个信号量集合。这个key同样可以根据文件系统上的一个文件的inode随机生成。
通过以下方式创建信号量集合:
1 | int semget(key_t key, int nsems, int semflg); |
key就是标识符号,nsems表示有几个信号量,
总结一下。共享内存和信号量的配合机制,如下图所示:无论是共享内存还是信号量,创建与初始化都遵循同样流程,通过 ftok 得到 key,通过 xxxget 创建对象并生成 id;
生产者和消费者都通过 shmat 将共享内存映射到各自的内存空间,在不同的进程里面映射的位置不同;
为了访问共享内存,需要信号量进行保护,信号量需要通过 semctl 初始化为某个值;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)