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…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...