0

0

Linux系统共享内存机制原理及在进程间高速通信的实践

冰川箭仙

冰川箭仙

发布时间:2026-03-18 08:41:31

|

545人浏览过

|

来源于php中文网

原创

Linux共享内存通过页表映射使多进程访问同一物理内存,无需内核拷贝,是System V IPC中最快方式;需配合信号量同步,用ftok生成唯一key,shmget/shmat/shmdt/shmctl管理生命周期。

linux系统共享内存机制原理及在进程间高速通信的实践

Linux共享内存的核心在于让多个进程通过页表映射,访问同一块物理内存区域。它不经过内核拷贝数据,直接读写内存,因此是System V IPC中速度最快、开销最低的通信方式。但要注意:它本身不带同步能力,必须配合信号量或互斥锁使用,否则容易出现数据竞争。

共享内存怎么做到“多个进程看到同一块内存”

每个进程都有独立的虚拟地址空间和页表。操作系统在物理内存中划出一段区域,然后把这段物理地址分别映射到不同进程的页表中——通常挂载到进程地址空间的“共享区”(堆与栈之间)。这样,虽然各进程用各自的虚拟地址访问,最终都落在同一片物理内存上。

这个过程由内核完成,用户通过系统调用触发:

  • shmget():申请物理内存 + 创建内核描述结构(shmid_ds),返回共享内存ID(shmid)
  • shmat():将该内存段映射进当前进程的虚拟地址空间,返回可读写的指针
  • shmdt():取消映射,仅断开进程与内存的关联,不释放物理内存
  • shmctl():控制生命周期,如IPC_RMID删除整个共享内存段

key值不是随便填的,得靠ftok生成

key是共享内存的唯一标识,用于跨进程定位同一段内存。不能硬编码数字(易冲突),也不能由系统随机分配(别的进程无法得知)。标准做法是用ftok()函数生成:

  • 第一个参数是**已存在的文件路径**(如/tmp/shm.key),必须真实存在且有读权限
  • 第二个参数是**非零整数proj_id**(如0x66),相当于项目编号,建议用ASCII字符或小整数
  • ftok内部用路径inode号和proj_id做简单运算,生成一个key_t类型值,重复概率极低

两个进程只要传入相同的路径和proj_id,就能得到同一个key,从而通过shmget拿到同一段共享内存。

MidReal AI
MidReal AI

MidReal AI是一款革命性的AI小说生成工具,同时也是一个文本互动冒险游戏平台。

下载

创建与使用的典型流程(含关键标志位)

服务端(先创建)和客户端(后连接)需协调好顺序。常用组合如下:

  • shmget(key, size, IPC_CREAT | 0644):若不存在则创建,存在则获取;0644设权限(类似文件)
  • shmget(key, size, IPC_CREAT | IPC_EXCL | 0644):只创建,若已存在则失败(避免误连旧数据)
  • shmat(shmid, nullptr, 0):让系统自动选择虚拟地址挂载;若需固定地址,第二个参数填目标地址(需对齐)
  • 读写时像操作普通内存一样:int* data = (int*)shmat(...); *data = 123;

注意:size建议按页对齐(如4096字节倍数),内核实际分配以页为单位,小尺寸也会占满一页。

别忘了清理和排查

共享内存段一旦创建,就独立于进程生命周期存在。进程退出不会自动销毁它,残留会导致内存泄漏或下次启动失败。

  • ipcs -m查看当前用户所有共享内存段(显示key、shmid、权限、大小、nattch连接数)
  • ipcrm -m shmid手动删除指定段;或在代码中调用shmctl(shmid, IPC_RMID, nullptr)
  • 如果shmat返回(void*)-1,常见原因:key错、权限不足、shmid无效、内存已满

实践时建议封装初始化/清理逻辑,确保每次运行前清除旧资源,避免调试时被历史残留干扰。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1091

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

619

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

355

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

135

2025.11.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.8万人学习

Git 教程
Git 教程

共21课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号