讲师中心 微信公众号
AI工具推荐 视频效率加速

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

大丽大大_6370

大丽大大_6370

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

|

605人浏览过

|

来源于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拿到同一段共享内存。

Linux Distros
Linux Distros

Linux发行版游乐场,适用于需要临时Linux沙箱、基于浏览器的Linux虚拟机、一次性终端环境、桌面Linux会话等场景

下载

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

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

  • 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工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

3970

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3393

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2553

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

6170

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

5802

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3393

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2905

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

3119

2023.07.25

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

20

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn