Linux下共享内存详解
共享内存是Linux中一种高效的进程间通信(IPC)方式,它允许多个进程共享同一段内存,从而实现数据的快速传递。共享内存通常比其他IPC机制(如管道或消息队列)更快,因为数据直接存储在内存中,而不需要额外的内核拷贝。
1. 共享内存的基础概念
在Linux中,共享内存有两种主要实现方式:
- POSIX共享内存:符合POSIX标准,通过
shm_open和mmap等函数操作。 - System V共享内存:这是传统的共享内存机制,依赖
shmget、shmat等函数。
两者的使用场景各有不同,POSIX共享内存通常更现代化、易用,且与文件系统相关联,而System V共享内存则具有较长的历史,并且更加底层。
2. System V 共享内存
2.1 shmget 函数
shmget用于创建或获取共享内存段,语法如下:
int shmget(key_t key, size_t size, int shmflg);
key:共享内存段的标识符,可以通过ftok函数生成。size:共享内存的大小。shmflg:权限标志,通常包括读写权限(如0666)以及IPC_CREAT(创建标志)等。
示例:
key_t key = ftok("file", 65); // 生成key
int shmid = shmget(key, 1024, 0666|IPC_CREAT); // 创建1KB大小的共享内存段
2.2 shmat 函数
shmat用于将共享内存段连接到当前进程的地址空间,语法如下:
void* shmat(int shmid, const void* shmaddr, int shmflg);
shmid:通过shmget获取的共享内存标识符。shmaddr:通常为NULL,让系统自动选择合适的地址。shmflg:标志位,常用0或SHM_RDONLY(只读模式)。
示例:
char* str = (char*) shmat(shmid, NULL, 0); // 连接共享内存段
2.3 shmdt 函数
shmdt用于分离共享内存段,即将共享内存从当前进程的地址空间中移除:
int shmdt(const void *shmaddr);
shmaddr:通过shmat返回的共享内存地址。
示例:
shmdt(str); // 分离共享内存段
2.4 shmctl 函数
shmctl用于控制共享内存段,比如删除共享内存段或获取共享内存段的信息:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
shmid:共享内存段的标识符。cmd:控制命令,如IPC_RMID(删除共享内存段)。buf:用于存储共享内存段的相关信息。
示例:
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存段
3. POSIX 共享内存
3.1 shm_open 函数
shm_open用于创建或打开一个共享内存对象,它与文件相关联,并且可以通过文件描述符访问,语法如下:
int shm_open(const char *name, int oflag, mode_t mode);
name:共享内存对象的名称,以/开头。oflag:标志位,常用O_CREAT(创建)、O_RDWR(读写)等。mode:权限,如0666。
示例:
int fd = shm_open("/myshm", O_CREAT | O_RDWR, 0666); // 创建/打开共享内存
3.2 ftruncate 函数
ftruncate用于调整共享内存对象的大小:
int ftruncate(int fd, off_t length);
fd:通过shm_open返回的文件描述符。length:共享内存对象的大小。
示例:
ftruncate(fd, 1024); // 调整共享内存大小为1KB
3.3 mmap 函数
mmap用于将共享内存映射到进程的地址空间中:
void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset);
addr:通常为NULL,表示由系统选择地址。length:映射的大小。prot:内存保护位,如PROT_READ(可读)、PROT_WRITE(可写)。flags:标志位,如MAP_SHARED(共享)。fd:通过shm_open返回的文件描述符。offset:通常为0。
示例:
void* ptr = mmap(0, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);//映射共享内存
3.4 munmap 函数
munmap用于解除共享内存的映射:
int munmap(void* addr, size_t length);
addr:映射内存的地址。length:映射的大小。
示例:
munmap(ptr, 1024); // 解除映射
3.5 shm_unlink 函数
shm_unlink用于删除共享内存对象,类似于System V中的shmctl的IPC_RMID命令:
int shm_unlink(const char *name);
name:共享内存对象的名称。
示例:
shm_unlink("/myshm"); // 删除共享内存对象
4. 共享内存的同步
共享内存本质上是多个进程之间的共享区域,因此需要同步机制以防止数据竞争。常见的同步方式包括信号量(semaphore)和互斥锁(mutex)。
示例: 可以使用POSIX信号量来同步共享内存的访问:
sem_t* sem = sem_open("/mysem", O_CREAT, 0666, 1); // 创建信号量
sem_wait(sem); // 进入临界区
// 访问共享内存
sem_post(sem); // 离开临界区
sem_close(sem); // 关闭信号量
sem_unlink("/mysem"); // 删除信号量
5. 总结
共享内存是Linux进程间通信中非常重要且高效的方式,既有POSIX标准的实现,也有传统的System V接口。通过共享内存,多个进程可以在不进行大量内核拷贝的情况下快速共享数据。不过,使用共享内存时需要注意进程间的同步,以避免数据不一致或竞争条件的发生。
相关文章:
Linux下共享内存详解
共享内存是Linux中一种高效的进程间通信(IPC)方式,它允许多个进程共享同一段内存,从而实现数据的快速传递。共享内存通常比其他IPC机制(如管道或消息队列)更快,因为数据直接存储在内存中&#x…...
MySQL篇(管理工具)
目录 一、系统数据库 二、常用工具 1. mysql 2. mysqladmin 3. mysqlbinlog 4. mysqlshow 5. mysqldump 6. mysqlimport/source 6.1 mysqlimport 6.2 source 一、系统数据库 MySQL数据库安装完成后,自带了一下四个数据库,具体作用如下…...
redis学习笔记(六)
redis每种数据结构的应用场景 1. 字符串 (String) 应用场景 : 缓存:存储频繁访问的数据,如网页缓存、会话信息等。计数器:实现统计和计数功能,如访问计数、统计数据等。键值存储:简单的键值对存储…...
spring与springmvc整合
文章目录 spring与springmvc整合重复创建bean容器关系获取spring容器上下文 spring与springmvc整合 在项目中使用springmvc的时候,由于spring和springmvc是同源的,有时候大家会把所有的配置都扔到springmvc的配置文件中,而不去区分spring和s…...
如何使用Optuna在PyTorch中进行超参数优化
所有神经网络在训练过程中都需要选择超参数,而这些超参数对收敛速度和最终性能有着非常显著的影响。 这些超参数需要特别调整,以充分发挥模型的潜力。超参数调优过程是神经网络训练中不可或缺的一部分,某种程度上,它是一个主要基于梯度优化问题中的“无梯度”部分。 在这…...
2.Spring-容器-注入
注册:将组件放入容器中; 注入:让容器按需进行操作; 一、Autowired:自动注入组件 原理:Spring调用容器的getBean 二、Qualifier 精确指定 精确指定:如果容器中组件存在多个,则使用…...
在uboot中添加自定义命令
有时候为了方便测试,我们需要在Uboot中添加自己的命令,这时可以通过下面的步骤实现: 1、在common目录下添加自己的命令文件“cmd_命令名.c”,如cmd_test.c,内容如下(参考模版): …...
AngularJS 模块
AngularJS 模块 AngularJS,作为一个强大且灵活的前端框架,其核心特性之一就是模块化。模块在AngularJS中扮演着至关重要的角色,它们是组织代码的主要方式,使得开发者能够创建可复用、可维护且易于测试的代码结构。本文将深入探讨AngularJS模块的概念、用途、创建方式以及最…...
[yotroy.cool] MGT 388 - Finance for Engineers - notes 笔记
个人博客https://www.yotroy.cool/,感谢关注~ 图片资源可能显示不全,请前往博客查看哦! ============================================================ Lecture 1 What is Accounting? The process of identifying, measuring and communicating economic informati…...
2024年9月python二级易错题和难题大全(附详细解析)(三)
2024年9月python二级易错题和难题大全(附详细解析)(三) 第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题第13题第14题第15题第16题第17题第18题第19题第20题第1题 1、以下程序的输出结果是() L1 = [4, 5, 6, 8].reverse() print(L1)A、[8, 6, 5, 4]&…...
【LLM多模态】Animatediff文生视频大模型
note AnimateDiff框架:核心是一个可插拔的运动模块,它可以从真实世界视频中学习通用的运动先验,并与任何基于相同基础T2I的个性化模型集成,以生成动画。训练策略:AnimateDiff的训练包括三个阶段: 领域适配…...
PDB数据库中蛋白质结构文件数据格式
在PDB(Protein Data Bank)数据库中,蛋白质结构文件通常以两种主要格式存储:.pdb(PDB格式)和 .cif(CIF格式,Crystallographic Information File)。这两种文件格式记录了蛋白质的三维结构坐标信息以及实验数据,但它们的表达方式和用途有所不同。 1. PDB数据库中的结构…...
C++自动驾驶面试核心问题整理
应用开发 概述:比较基础,没啥壁垒,主要有linux开发经验即可 问题:基础八股,如计算机网络、操作系统、c11等基础三件套;中等难度算法题1-2道。 中间件开发(性能优化) 概述&am…...
2024寻找那些能精准修改PDF内容的工具
如今,我们使用 PDF 文档的频率不断攀升,很多时候收到的表格等资料都是 PDF 格式。若先进行格式转换后编辑,再转换回 PDF 格式,着实有些麻烦。那么,pdf怎么编辑修改内容呢?在这篇文章中,我将为大…...
POI操作EXCEL增加下拉框
文章目录 POI操作EXCEL增加下拉框 POI操作EXCEL增加下拉框 有时候通过excel将数据批量导入到系统,而业务操作人员对于一些列不想手动输入,而是采用下拉框的方式来进行选择 采用隐藏sheet页的方式来进行操作 String sheetName "supplier_hidden_s…...
新手教学系列——基于统一页面的管理后台设计(二)集成篇
在现代企业级应用中,后台管理系统不仅是业务运营的核心,还承担着数据管理、用户权限控制等重要功能。随着业务规模的不断扩大,系统架构逐渐向微服务转变,多个后端服务模块协同工作,如何高效地集成这些模块,确保系统的稳定性和可维护性,成为开发者亟需解决的问题。在《新…...
计算机毕业设计之:基于微信小程序的疫苗预约系统的设计与实现(源码+文档+讲解)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Redis事务总结
1.事务介绍 Redis 事务是一个用于将多个命令打包在一起执行的功能,它可以确保这些命令按照顺序执行,并且具有原子性。这意味着事务中的命令要么全部执行,要么全部不执行,这有助于保持数据的一致性。 Redis 事务本质:…...
1.4 MySql配置文件
既然我们开始学习数据库,就不能像大学里边讲数据库课程那样简单讲一下,增删改查,然后介绍一下怎么去创建索引,怎么提交和回滚事务。我们学习数据库要明白怎么用,怎么配置,学懂学透彻了。当然MySql的配置参数…...
前后端分离集成CAS单点登录
修改nginx worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location /api/ {proxy_pass htt…...
无王无帝定乾坤,来自田间第一人:大道同源归本心
无王无帝定乾坤,来自田间第一人。 世间千般法理,万般修行,流派纷杂,说辞各异; 世人终日寻道问路,遍历山河苦思真谛, 却往往舍近求远,向外求索不休, 反倒遗忘最本真的根源…...
挤馅机性价比选择:企业采购决策关键因素深度解析
挤馅机性价比选择:企业采购决策关键因素深度解析“选挤馅机只看价格?错!挤馅机性价比的核心是‘长期使用成本’而非‘单次采购价’”企业采购挤馅机时,常陷入“价格越低越划算”的误区,却忽略了后期维护、产能波动等隐…...
保姆级教程:用PHPStudy+Nginx一键部署新麦同城V3开源版(附数据库配置避坑点)
零基础30分钟部署新麦同城V3:PHPStudyNginx全流程避坑指南 第一次接触本地部署开源系统时,最怕的不是代码复杂,而是明明按教程操作却卡在某个配置环节。本文将以真实踩坑记录为核心,手把手带你在Windows环境下用PHPStudy快速搭建…...
树莓派网页编辑器:云端开发环境革新与实战指南
1. 项目概述:一次开发体验的“降维”革新最近,树莓派基金会悄无声息地放出了一个重磅工具:一个可以直接在网页浏览器里运行的代码编辑器。这个消息乍一听,可能不如发布一块新的、性能翻倍的树莓派单板计算机那么激动人心ÿ…...
protobufjs 编译命令选错就报错?一文搞懂 pbjs 的 -w 参数(es6 vs commonjs 实战解析)
ProtobufJS编译模块类型选型指南:ES6与CommonJS的深度对比与实战避坑 最近在Vite项目中集成Protobuf时,编译后的模块导入总是抛出The requested module does not provide an export named错误。这个问题困扰了我整整两天,最终发现根源在于pbj…...
Escrcpy终极指南:简单高效的Android图形化投屏完整方案
Escrcpy终极指南:简单高效的Android图形化投屏完整方案 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 你是否厌倦了复杂的命令行操…...
iOS 27 Siri 自动删除聊天记录:深度解析与行业启示
上周同事跟我吐槽,说他跟Siri聊了点私事,换手机时发现聊天记录全在iCloud里躺着。我跟他说,等iOS 27吧,Siri终于要加自动删除功能了。这个功能不算革命性创新,但方向是对的。下面从用户价值、技术实现和行业影响三个维…...
KUKA机器人FSoE安全地址丢了别慌!手把手教你用WorkVisual 6.0找回(附KRC4标准柜地址表)
KUKA机器人FSoE安全地址丢失应急修复指南:WorkVisual 6.0实战全解析 当产线突然报警停机,示教器闪烁"FSoE安全地址丢失"的红色警告时,经验丰富的维护工程师都知道——这往往是EtherCAT网络拓扑结构异常引发的紧急故障。尤其在采用K…...
告别NeRF的漫长等待:用3D Gaussian Splatting在Colab上5分钟跑通你的第一个3D场景
5分钟在Colab玩转3D高斯泼溅:零基础极速生成你的3D场景 当你想把几张随手拍的照片变成可自由旋转的3D场景时,传统方法可能需要数小时甚至更久的等待。现在,3D高斯泼溅(3D Gaussian Splatting)技术让这一切变得触手可及…...
毕业设计:基于springboot的林业产品推荐系统(源码)
4 系统设计当前,系统的类型有很多,从系统呈现的内容来看,系统的类型有社交类,有商业类,有政府类,有新闻类等。那么,在众多系统类型中,先明确将要设计的系统的类型才是系统设计的首要…...
