当前位置: 首页 > news >正文

Linux下共享内存详解

共享内存是Linux中一种高效的进程间通信(IPC)方式,它允许多个进程共享同一段内存,从而实现数据的快速传递。共享内存通常比其他IPC机制(如管道或消息队列)更快,因为数据直接存储在内存中,而不需要额外的内核拷贝。

1. 共享内存的基础概念

在Linux中,共享内存有两种主要实现方式:

  • POSIX共享内存:符合POSIX标准,通过shm_openmmap等函数操作。
  • System V共享内存:这是传统的共享内存机制,依赖shmgetshmat等函数。

两者的使用场景各有不同,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:标志位,常用0SHM_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中的shmctlIPC_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数据库安装完成后,自带了一下四个数据库,具体作用如下&#xf…...

redis学习笔记(六)

redis每种数据结构的应用场景 1. 字符串 (String) 应用场景 : 缓存:存储频繁访问的数据,如网页缓存、会话信息等。计数器:实现统计和计数功能,如访问计数、统计数据等。键值存储:简单的键值对存储&#xf…...

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

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...