快速导航×

【深入学习Linux】System V共享内存2025-07-24 08:48:04

前言

早在设计unix时,系统开发者就发现了一个悖论:在某些情况下,系统中的进程既要满足互相隔离又要彼此协同合作。

由此衍生出了System V IPC等通信方式,在保持进程独立性的前提下,通过内核中介、权限控制和同步机制实现安全通信。

System V IPC通信机制主要包括:消息队列/ 信号量/ 共享内存三种通信方式,本文主要讨论共享内存的概念原理以及使用方式。


一、共享内存是什么?

先来看看共享内存的概念:

在对共享内存的概念有了一定了解后,再来理解共享内存的原理。

共享内存实现原理

在不破坏进程独立性的前提下让两个进程通信,操作系统通过引入能让两个进程都能看到的同一份“资源”实现。对于共享内存,这份资源就是物理内存上的一段内存块。

以下阐述共享内存的原理。

【深入学习Linux】System V共享内存
共享内存细节理解

1)C/C++语言中的malloc等申请空间的函数能用于申请共享内存吗?

不能,malloc等函数申请的空间只属于该进程自己,不能被其他进程共享。共享内存机制是专门设计出来用于IPC进程间通信的。

2)共享内存是一种通信方式,想要通信的进程都可以使用。当两个进程希望进行通信时,可以使用已有的正在被其他进程使用的共享内存通信,也可以额外申请一块内存用于通信,根据实际需求决定。

3)系统中可能同时存在很多共享内存块。

二、接口认识1.shmget函数——申请共享内存

【深入学习Linux】System V共享内存
【深入学习Linux】System V共享内存
2.ftok函数——生成key值

【深入学习Linux】System V共享内存
【深入学习Linux】System V共享内存
再次理解ftok和shmget1)key与shmid的区别与联系

ftok函数返回值是key,shmget的返回值是shmid(共享内存标识符)。key与shmid的关系,有些类似于文件描述符fd与inode的关系,一个是应用进程层面使用的(shmid与fd),另一个是系统内核层面使用的(key与inode)。

【深入学习Linux】System V共享内存
2)再理解key

【深入学习Linux】System V共享内存
3)通过指令查看/释放系统中的ipc资源

【深入学习Linux】System V共享内存

删除共享内存指令:

【深入学习Linux】System V共享内存

shmid可以通过上述ipcs指令查看。3.shmctl函数——控制、释放共享内存

【深入学习Linux】System V共享内存
【深入学习Linux】System V共享内存
struct shmid_ds是什么

在shmctl函数的第三个参数中出现了struct shmid_ds结构体,该结构体是操作系统暴露给用户级的一种数据结构,他与操作系统为方便管理共享内存创建的数据结构再内容上高度类似(系统中的还要更为复杂)。

struct shmid_ds其中记录了该共享内存的属性,包括现在有哪些进程正在通过该共享内存通信的信息,以及key值等。

【深入学习Linux】System V共享内存

若想获取共享内存的属性参数,可以通过创建一个空的struct shmid_ds对象,再将地址传入shmctl函数中。注意此时的comd参数需传入IPC_STAT。

小爱开放平台 小爱开放平台

小米旗下小爱开放平台

小爱开放平台 291 查看详情 小爱开放平台 代码语言:j*ascript代码运行次数:0运行复制
struct shmid_ds tmp;shmctl(shmid,IPC_STAT,&tmp);
4.shmat函数和shmdt函数——对共享内存进行关联和去关联

【深入学习Linux】System V共享内存
【深入学习Linux】System V共享内存

注意:正确的释放共享内存的流程应该是,先将进程与共享内存去关联,然后再释放共享内存

【深入学习Linux】System V共享内存

这里附上笔者总结的共享内存创建流程:

在申请共享内存时应做到,谁申请,谁释放。

【深入学习Linux】System V共享内存
三、共享内存的优缺点分析

1.优点

共享内存在所有进程通信间,通信速度是最快的——能减少的拷贝次数。

何以见得共享内存能减少拷贝次数?

假如同样的代码和数据,综合考虑管道和共享内存分别进行通信,在考虑上键盘输入,和显示器输出后,共享内存有几次拷贝数据,管道呢?

【深入学习Linux】System V共享内存
【深入学习Linux】System V共享内存

由上图我们可以清楚的观察到,相比管道,共享内存不用在buffer缓冲区中临时中转一下,由此能够减少一定的数据拷贝。

2.缺点

共享内存在数据通信时,没有对数据做任何保护——没有同步、互斥机制。

甚至管道可能出现写端还未写完数据,而读端就来读取的情况——这时读端大概率读到无意义的数据。

【深入学习Linux】System V共享内存

比如,管道通信写端在没有写入数据时,读端会被OS阻塞,反之亦然;

管道在读端将数据读取后,写端再写会覆盖已读的数据。

是否能在不使用信号量的前提下,对共享内存进行保护?

可以给通信的进程双方添加管道,凡共享内存通信前先借助管道确认对方是否准备完毕。

读/写端先不直接访问共享内存,而是先通过管道通信确认后,再通过共享内存通信。

比如,读端想要通过共享内存读取数据之前,先在管道读端处读取信号(如一个特定字符)。若未读取到特定值字符,则由于管道的特性读端进程会被阻塞,直到写端发来信号。

【深入学习Linux】System V共享内存

总结

本文详细介绍了System V通信方式中的“共享内存”通信方式。从原理的介绍,到接口的使用,再到最后的优缺点分析,较为系统的剖析共享内存的原理和使用。

虽然共享内存在如今这个万物互联的世界越来越不常用,但在某些脱网单机情况下依旧是进程通信的最佳选择。

以上就是【深入学习Linux】System V共享内存的详细内容,更多请关注其它相关文章!


# 虚拟内存  # 长沙市网站建设  # 如何判断网站优化好坏啊  # 临沂网站建设单位信息  # 安阳seo电子书  # 创作灵感网站建设教程  # 机电网站推广教程  # 扫码点餐怎么营销推广的  # 成都抖音seo招商  # 建设银行天津网站  # 邵阳网站建设排名  # 情况下  # 返回值  # 共享内存  # 前提下  # 可以使用  # 可以通过  # 信号量  # 小爱  # 数据结构  # 同步机制  # 区别  # c++  # 操作系统  # linux 


相关栏目: 【 企业资讯168 】 【 行业动态50218 】 【 媒体报道120512


相关推荐: 酷狗音乐pc版的每日推荐在哪 酷狗音乐PC版每日推荐查找指南  进口超级维特拉三门版power是什么意思  typescript中文怎么读  市盈率ttm市盈动静是什么意思  苹果怎么没出5g手机  域名解析后为什么要进行域名备案  如何用好typescript  如何通过dos命令  羽毛球拍power9是什么意思  为什么ai老是说链接面板中缺少某些文件  python如何命令行换行  学typescript有什么用  ftp$如何执行宏命令  如何用命令连接mysql  夸克网盘为什么解析错误  苹果16系统有哪些改变  单片机怎么连接电路图  linux如何合并分区命令  如何寻找和修复无法在 AI 中找到文件的问题  高市盈率是什么意思  什么软件能下载夸克视频  电信开通nfc功能是什么意思  固态硬盘损坏如何修复  命令控制台如何执行sql文件  网络光刻机是干什么用的  单片机是怎么计时的  如何在命令提示符播放音频  阿里云盘共享账户怎么用  电焊机power和oc是什么意思  j*a map数组怎么用  空调主板单片机怎么拆开  萝卜快跑的收费标准是什么  服务器系统怎么装  电脑type-c接口是什么意思  新版路由器如何设置路由命令  一秒是多少毫秒  j*a里怎么输入数组  什么是unix时间戳  2025年国外最佳语音聊天软件排行榜  燃气热水器上的power是什么意思  五十铃x-power是什么意思  vs怎么编写typescript  电瓶车屏幕上显示power是什么意思  征信不好如何短期恢复  苹果16要升级哪些功能  春运返程如何抢票成功  征信不好如何快速恢复 征信不好快速恢复的方法  type-c输入接口是什么  推特是什么软件国内可以使用吗  比亚迪秦nfc功能是什么意思