Linux中共享内存(mmap函数的使用)

news2024/11/15 9:38:21

内存映射的基本使用

  • 内存映射
    概念:
    使一个磁盘文件与内存中的一个缓冲区相映射,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write。
    mmap()的优点:
    实现了用户空间和内核空间的高效交互方式
    • 优化前:在这里插入图片描述
    • 优化后:
      在这里插入图片描述
    • 文件映射图
      在这里插入图片描述
  • 函数定义:
    void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
    功能:创建共享内存映射
    函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值
    参数说明:
    addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。
    length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。
    prot:指定共享内存的访问权限。可取如下几个值的可选:PROT_READ(可读), PROT_WRITE(可写), PROT_EXEC(可执行), PROT_NONE(不可访问)。
    flags:由以下几个常值指定:MAP_SHARED(共享的) MAP_PRIVATE(私有的), MAP_FIXED(表示必须使用 start 参数作为开始地址,如果失败不进行修正),其中,MAP_SHARED , MAP_PRIVATE必选其一,而 MAP_FIXED 则不推荐使用。MAP_ANONYMOUS(匿名映射,用于血缘关系进程间通信)
    fd:表示要映射的文件句柄。如果匿名映射写-1。
    offset:表示映射文件的偏移量,一般设置为 0 表示从文件头部开始映射。
    注意事项:
    (1) 创建映射区的过程中,隐含着一次对映射文件的读操作,将文件内容读取到映射区。
    (2) 当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限(出于对映射区的保护),如果不满足报非法参数(Invalid argument)错误。
    当MAP_PRIVATE时候,mmap中的权限是对内存的限制,只需要文件有读权限即可,操作只在内存有效,不会写到物理磁盘,且不能在进程间共享。
    (3) 映射区的释放与文件关闭无关,只要映射建立成功,文件可以立即关闭。
    (4) 用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)
    (5) 文件偏移量必须为0或者4K的整数倍(不是会报非法参数Invalid argument错误).
    (6)映射大小可以大于文件大小,但只能访问文件page的内存地址,否则报总线错误 ,超出映射的内存大小报段错误
    注意:文件大小和内存映射的关系图
    在这里插入图片描述
    在这里插入图片描述
    (7)mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。
  • mmap()映射的种类:
    基于文件的映射
    • 案例代码:
      读代码如下:
      在这里插入图片描述
    • 写代码如下:
      在这里插入图片描述
    • 运行如下:
      在这里插入图片描述
  • 匿名映射
    适用于具有亲缘关系的进程之间
    • 代码如下:
      在这里插入图片描述
  • 释放内存映射
    munmap函数
    int munmap(void *addr, size_t length);
    返回值:成功返回0,失败返回-1,并设置errno值。
    函数参数:
    addr:调用mmap函数成功返回的映射区首地址
    length:映射区大小(即:mmap函数的第二个参数)

System V IPC

  • IPC对象包含:共享内存、消息队列和信号灯集
  • 每个IPC对象有唯一的ID,用Key关联
  • IPC对象创建后一直存在,直到被显示地删除
  • ipcs/ipcrm
  • 共享内存
    • 共享内存是一种最为高效的进程间通信放肆,进程可以直接读写内存,而不需要任何数据的拷贝
    • 共享内存存在内核空间创建,可被进程映射到用户空间访问,使用灵活
    • 由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用
  • 共享内存使用步骤
    1生成key
    2创建/打开共享内存
    3映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问
    4 读写共享内存
    5 撤销共享内存映射
    6 删除共享内存对象
  • 生成key函数如下:
    key_t ftok(const char *path, int id);
    其中参数path是指定的文件名,这个文件必须是存在的而且可以访问的。id是子序号,它是一个8bit的整数。即范围是0~255。当函数执行成功,则会返回key_t键值,否则返回-1。在一般的UNIX中,通常是将文件的索引节点取出,然后在前面加上子序号就得到key_t的值
  • 生成key代码如下:
    在这里插入图片描述
  • 创建共享内存函数:
    共享内存创建 – shmget
    int shmget(key_t key, int size, int shmflg);
  • 共享内存映射
    void *shmat(int shmid, const void *shmaddr, int shmflg);
    第二个参数一般写NULL,表示自动映射
    第三参数一般写0 ,表示可读写
  • 共享内存撤销
    int shmdt(void *shmaddr);
    撤销后,内存地址不可再访问。
  • 共享内存控制
    int shmctl(int shmid, int cmd, struct shmid_ds *buf);
    shmctl(shmid, IPC_RMID, NULL);删除共享内存
  • 总体代码如下:
    在这里插入图片描述
    注:撤销和删除有区别的,删除是彻底删除,需要重新创建,而撤销则内存还在那,但要注意不用的时候一定要撤销,不然别人想删除删不掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据调用链监控平台技术原理

一、AOP技术总结 二、监控逻辑动态织入原理 三、JVM动态织入流程 四、调用链监控平台技术简要总结 &#xff08;一&#xff09;、单服务的无感知自动日志埋点 jvm层面的字节码织入埋点&#xff0c;javaagent方式启动。 &#xff08;二&#xff09;、多服务调用链串联 trace…

Linux命令:traceroute命令

目录 traceroute1、简介2、探测原理3、traceroute说明4、实例设置每跳探测数设置跳数探测包使用的基本UDP端口设置6789把对外发探测包的等待响应时间设置为3秒 总结 traceroute 1、简介 traceroute的主要功能是跟踪从IP网络发送到指定主机经过的网关的工具。它利用IP协议的生…

树莓派4b连接WQ9201外置无线网卡命令行配置详解

树莓派4B连接WQ9201无线网卡 接线方式 蓝色的线来连接树莓派和WQ9201demo板&#xff0c;USB接树莓派的USB接口&#xff0c;microUSB一端接demo板靠近天线部分的microUSB口。 驱动和固件准备 驱动直接放在树莓派系统的任意目录&#xff0c;目前配置则是将驱动放在树莓派的主目…

DDoS攻击激增,分享高效可靠的DDoS防御方案

当下DDoS攻击规模不断突破上限&#xff0c;形成了 "网络威胁格局中令人不安的趋势"。专业数据显示&#xff0c;对比2022年上半年与2023年上半年&#xff0c;所有行业的DDoS攻击频率增加了314%。其中零售、电信和媒体公司遭受的攻击规模最大&#xff0c;三个垂直行业的…

vue3:24—组件通信方式

1、props 子组件也可以如下调用父组件的方法 2、自定义事件 &#xff08;emit&#xff09; 3、mitt&#xff08;任意组件的通讯&#xff09; 1. pubsub 2. $bus 3. mitt 接收数据的:提前绑定好事件(提前订阅消息)提供数据的:在合适的时候触发事件发布消息) 安装mitt npm i…

JVM 性能调优 - 常用的垃圾回收器(6)

垃圾收集器 在 JVM(Java虚拟机)中,垃圾收集器(Garbage Collector)是负责自动管理内存的组件。它的主要任务是在程序运行过程中,自动回收不再使用的对象所占用的内存空间,以便为新的对象提供足够的内存。 JVM中的垃圾收集器使用不同的算法和策略来实现垃圾收集过程,以…

生产问题-并发重复生成订单(幂等性)问题

情景回顾 某天运营同事发现管理后台生成了两条重复的订单&#xff0c;反馈到技术部门进行紧急排查。 伪代码分析 通过排查代码发现&#xff0c;发现核心代码有并发问题&#xff0c;根据事务传递性锁中的事务无法独立生效&#xff0c;所以锁释放时事务并没有提交&#xff0c;…

Redis分布式锁的使用案例

一、引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.5.0</version> </dependency> 二、工具类 package com.hl.redisdemo.util;import redis.clients.jedi…

蓝桥杯Web应用开发-CSS3 新特性

CSS3 新特性 专栏持续更新中 在前面我们已经学习了元素选择器、id 选择器和类选择器&#xff0c;我们可以通过标签名、id 名、类名给指定元素设置样式。 现在我们继续选择器之旅&#xff0c;学习 CSS3 中新增的三类选择器&#xff0c;分别是&#xff1a; • 属性选择器 • 子…

Swin-UMamba:结合基于ImageNet的预训练和基于Mamba的UNet模型

摘要 https://arxiv.org/pdf/2402.03302v1.pdf 准确的医学图像分割需要整合从局部特征到全局依赖的多尺度信息。然而&#xff0c;现有方法在建模长距离全局信息方面面临挑战&#xff0c;其中卷积神经网络&#xff08;CNNs&#xff09;受限于其局部感受野&#xff0c;而视觉转换…

python学习21

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

JavaScript中闭包的定义、原理及应用场景

JavaScript是一门以函数为核心的编程语言&#xff0c;其独特的闭包特性是众多开发者所喜爱的特点之一。闭包是一种非常强大的概念&#xff0c;可以帮助我们实现许多复杂的功能和逻辑。本篇博客将为大家深入介绍JavaScript中闭包的定义、原理及应用场景&#xff0c;并通过示例代…

jpeg交叉编译(rv1126)

1.下载 官网下载地址 Independent JPEG Group (ijg.org) 2.解压 1)新建文件夹,解压源码(文件夹 jpeg-9f) 2)新建install-rv1126文件夹 具体目录结构如下图所示。 3.配置 1)进入源码文件夹jpeg-9f 2) export CC=/usr/bin/arm-linux-gnueabihf-gcc ./configure CC=…

Netty中使用编解码器框架

目录 什么是编解码器&#xff1f; 解码器 将字节解码为消息 将一种消息类型解码为另一种 TooLongFrameException 编码器 将消息编码为字节 将消息编码为消息 编解码器类 通过http协议实现SSL/TLS和Web服务 什么是编解码器&#xff1f; 每个网络应用程序都必须定义如何…

STM32Cubmax stm32f103zet6 SPI通讯

一、基本概念 SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI 接口主要应用在 EEPROM&#xff0c; FLASH&#xff0c;实时时 钟&#xff0c; AD 转换器&#xff0c;还有数…

Ubuntu下anaconda的常用操作

Ubuntu下anaconda的安装及常用操作 安装Anaconda 下载Anaconda&#xff1a;在Anaconda官网下载适合你系统的Anaconda安装包&#xff08;通常是64位的Linux版本&#xff09;。 安装Anaconda 在终端中导航到你下载Anaconda安装包的目录&#xff0c;然后运行以下命令安装Anacon…

Verilog刷题笔记19

题目&#xff1a; A common source of errors: How to avoid making latches When designing circuits, you must think first in terms of circuits: I want this logic gate I want a combinational blob of logic that has these inputs and produces these outputs I want…

Avalonia学习(二十三)-大屏

弄一个大屏显示的界面例子&#xff0c;但是代码有点多&#xff0c;还有用户控件。 目前还有一点问题在解决&#xff0c;先看一下界面效果。

人工智能 | 深度学习的进展

深度学习的进展 深度学习是人工智能领域的一个重要分支&#xff0c;它利用神经网络模拟人类大脑的学习过程&#xff0c;通过大量数据训练模型&#xff0c;使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来&#xff0c;深度学习在多个领域取得了显著的进展&#…