Linux共享内存实现机制的详解

发布时间 - 2026-01-11 02:15:56    点击率:

Linux共享内存实现机制的详解

内存共享: 两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建 立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回 文件的。因此,采用共享内存的通信方式效率是非常高的。

共享内存实现机制

共享内存是通过把同一块内存分别映射到不同的进程空间中实现进程间通信。而共享内存本身不带任何互斥与同步机制,但当多个进程同时对同一内存进行读写操作时会破坏该内存的内容,所以,在实际中,同步与互斥机制需要用户来完成。
来看几个系统调用函数:

(1)创建共享内存



参数:key为输出型参数
size:size的大小应为1024整数倍(4k对齐)
shmflg:权限标志

(2)将共享内存映射到自己的内存空间:shmat

shmat是空间映射,通过创建的共享内存,在它能被进程访问之前,需要把该段内存映射到用户进程空间。shmaddr是用来指定共享内存映射到当前进程中的地址位置,要想改设置有用,shmflag必须设置为SHM_RND标志。大多情况下,应设置为空指针(void*)0,让系统自动选择地址,从而减小程序对硬件的依赖性。shmflag除了上面的设置外,还可以设置为SHM_RDONLY,使得映射过来的地址只读。
返回值:调用成功则返回映射地址的第一个字节,失败返回-1。
(3)解除映射:shmdt



参数为要解除的地址空间。

(4)控制共享内存

先来看第三个参数的结构体:


第二个参数cmd的选项:IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构体复制到buf里

IPC_SET:改变共享内存的状态,把buf所指的结构体中的uid,gid,mode,复制到共享内存的shmid_ds结构体内
IPC_RMID:删除这块共享内存
BUF:共此内存管理结构体

代码实现:

共享内存的特点:

(1)共享内存就是允许两个不想关的进程访问同一个内存
(2)共享内存是两个正在运行的进程之间共享和传递数据的最有效的方式
(3)不同进程之间共享的内存通常安排为同一段物理内存
(4)共享内存不提供任何互斥和同步机制,一般用信号量对临界资源进行保护。
(5)接口简单

所有进程间通信的特点:

(1)管道

管道分为命名管道和匿名管道。匿名管道只能单向通信,且只能在有亲缘关系的进程间使用,常用于父子进程,当一个进程创建了一个管道,并调用fork创建子进程后,父进程关闭读端,子进程关闭写端,实现单向通信。管道是面向字节流,自带互斥与同步机制,生命周期随进程。
命名管道与匿名管道:命名管道允许毫不相干的两个进程之间

(2)信号量

信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步,常作为一种锁机制,防止某进程在访问资源时其他进程也来访问,因此,主要作为进程间以及同一进程的不同线程间的同步手段。

(3)消息队列

消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区受限等特点。消息队列是UNIX下不同进程之间可以实现资源共享的 一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程,对消息队列具有操作权限的进程都可以使用msgget完成对消息队列的操作控制,通过使用消息类型,进程可以按顺序读信息,或为消息安排优先级顺序。

(4)共享内存

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他IPC方式运行效率低而专门设计的,它往往与其他机制,如信号量,配合使用,来实现进程间的同步。

    以上就是Linux共享内存实现机制的内容详细介绍,大家可以参考下,如果有疑问的可以到本站留言,进行讨论。感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Linux共享内存  # Linux共享内存的详解  # Linux共享内存分析  # Linux下用Valgrind做检查(防止内存泄露)  # jmeter在linux系统下运行及本地内存调优的方法详解  # linux swap交换内存扩容的方法  # Python3监控windows  # linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例  # Linux内核私闯进程地址空间并修改进程内存的方法  # 如何利用Bash脚本监控Linux的内存使用情况  # Linux系统查看CPU、机器型号、内存等信息  # Linux中大内存页Oracle数据库优化的方法  # 详解Linux内核内存管理架构  # Linux系统下利用C程序输出某进程的内存占用信息  # 解决Linux下php-fpm进程过多导致内存耗尽问题  # python监控linux内存并写入mongodb(推荐)  # Linux内存描述符mm_struct实例详解  # Linux 下如何检查内存使用率  # 信号量  # 多个  # 互斥  # 设置为  # 自己的  # 是一个  # 几个  # 是在  # 还可以  # 第一个  # 毫不相干  # 两次  # 它是  # 要在  # 这段  # 希望能  # 要想  # 第二个  # 可以直接  # 详细介绍 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何创建自定义中间件?(Middleware代码示例)  如何快速搭建虚拟主机网站?新手必看指南  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在搬瓦工VPS快速搭建网站?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  详解jQuery中基本的动画方法  Laravel集合Collection怎么用_Laravel集合常用函数详解  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  深圳网站制作的公司有哪些,dido官方网站?  如何在IIS7中新建站点?详细步骤解析  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  JavaScript如何实现音频处理_Web Audio API如何工作?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel安装步骤详细教程_Laravel环境搭建指南  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何快速生成凡客建站的专业级图册?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何自定义建站之星网站的导航菜单样式?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel怎么清理缓存_Laravel optimize clear命令详解  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何在阿里云高效完成企业建站全流程?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  高防服务器租用指南:配置选择与快速部署攻略  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  装修招标网站设计制作流程,装修招标流程?  如何在云主机上快速搭建多站点网站?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  EditPlus 正则表达式 实战(3)  Laravel怎么使用artisan命令缓存配置和视图  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  香港服务器租用每月最低只需15元?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】