Linux之共享内存mmap用法实例(六十三)

news2024/11/17 13:51:19

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Linux mmap介绍
    • 🌻3.代码实例
      • 🐓3.1 基本内存映射和读取
      • 🐓3.2 共享内存映射和写入
      • 🐓3.3 匿名内存映射

🌻1.前言

本篇目的:Linux之共享内存mmap用法实例

🌻2.Linux mmap介绍

  • Linux下的mmap是一种内存映射的机制,允许用户空间的应用程序将文件或设备直接映射到内存中。这种机制可以提供高效的大文件读写方式,同时避免了传统文件读写操作的系统调用开销。
  • mmap机制将文件内容映射到进程的地址空间,使得进程可以通过操作内存的方式读写文件,而无需进行文件系统的I/O操作。这对于频繁访问大型文件的应用程序来说,可以显著提高性能,因为它减少了数据在用户空间和内核空间之间的拷贝次数。
  • mmap函数的原型定义在<sys/mman.h>头文件中,其基本调用形式如下:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • 参数说明如下:
  • addr:指定映射内存的起始地址,通常设置为NULL,让系统自动选择。
  • length:要映射的内存长度。
  • prot:映射区域的保护模式,可以是PROT_READPROT_WRITEPROT_EXEC等,或者它们的组合。
  • flags:映射区域的标志,常用的标志有MAP_SHAREDMAP_PRIVATEMAP_ANONYMOUSMAP_GROWSDOWN等。
  • fd:文件描述符,来自于之前对文件的open操作。
  • offset:文件映射开始的偏移量,通常是对文件大小的偏移。
    mmap的返回值是一个void*类型的指针,指向映射内存的起始地址。如果映射失败,则返回NULL,并设置errno来指示错误。
    内存映射通常分为两种模式:
  1. MAP_SHARED:映射区域的内存可以被多个进程共享。对共享映射区域的修改会立即反映到文件系统中,反之亦然。
  2. MAP_PRIVATE:映射区域的内存对其他进程是不可见的。对私有映射区域的修改不会影响文件系统,但可以提高数据访问的效率。
    此外,mmap还可以用于匿名内存映射,即不与任何文件关联的内存映射。这时可以使用MAP_ANONYMOUS标志,并通常与/dev/zero设备文件一起使用,以分配不来自文件的内存。
  • 内存映射的解除可以通过munmap函数实现,其原型如下:
int munmap(void *addr, size_t length);
  • 参数addrmmap返回的地址,length是要解除映射的长度。成功时返回0,失败时返回-1并设置errno
  • mmap机制在Linux系统中广泛应用于高效的数据处理,如数据库、缓存、文件共享等。它也是许多高性能服务器和客户端应用程序的关键特性之一。
  • 使用mmap时,开发者需要充分理解内存保护机制,以避免可能的竞态条件和数据不一致问题。

🌻3.代码实例

🐓3.1 基本内存映射和读取

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <string>

int main() {
    // 打开文件
    int fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        std::cerr << "Open file failed." << std::endl;
        return 1;
    }

    // 映射文件
    void* map = mmap(NULL, 1024, PROT_READ, MAP_PRIVATE, fd, 0);
    if (map == MAP_FAILED) {
        std::cerr << "Map memory failed." << std::endl;
        close(fd);
        return 1;
    }

    // 读取映射的内容
    char buffer[1024];
    std::memcpy(buffer, map, 1024);

    // 输出内容
    std::cout << "Content of the file: " << buffer << std::endl;

    // 解除映射
    munmap(map, 1024);

    // 关闭文件
    close(fd);

    return 0;
}

🐓3.2 共享内存映射和写入

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <string>

int main() {
    // 创建共享内存文件
    int fd = open("shared_memory.txt", O_RDWR | O_CREAT, 0644);
    if (fd == -1) {
        std::cerr << "Open file failed." << std::endl;
        return 1;
    }

    // 映射文件
    void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (map == MAP_FAILED) {
        std::cerr << "Map memory failed." << std::endl;
        close(fd);
        return 1;
    }

    // 写入内容
    std::string message("Hello, shared memory!");
    std::memcpy(map, message.c_str(), message.size());

    // 输出内容
    char buffer[1024];
    std::memcpy(buffer, map, 1024);
    std::cout << "Written content: " << buffer << std::endl;

    // 解除映射
    munmap(map, 1024);

    // 关闭文件
    close(fd);

    return 0;
}

🐓3.3 匿名内存映射

#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <string>

int main() {
    // 创建一个匿名内存区域
    void* map = mmap(NULL, 1024, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    if (map == MAP_FAILED) {
        std::cerr << "Map memory failed." << std::endl;
        return 1;
    }

    // 写入内容
    std::string message("Hello, anonymous memory!");
    std::memcpy(map, message.c_str(), message.size());

    // 输出内容
    char buffer[1024];
    std::memcpy(buffer, map, 1024);
    std::cout << "Written content: " << buffer << std::endl;

    // 输出内容
    char buffer[1024];
    std::memcpy(buffer, map, 1024);
    std::cout << "Written content: " << buffer << std::endl;

    // 解除映射
    munmap(map, 1024);

    return 0;
}

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

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

相关文章

通过注意力调节实现更好的文本到图像生成对齐

近年来&#xff0c;生成性AI技术在众多领域取得了前所未有的进步。大规模预训练模型的出现激发了各种下游任务中的新应用。这在文本到图像生成领域尤为明显&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已经显著展示了它们的能力。尽管如此&#xff0c;复杂提示中…

Go语言的pprof工具是如何使用的?

文章目录 Go语言的pprof工具详解pprof的使用runtime/pprofnet/http/pprof 快速开始获取采样数据通过pprof工具进行性能分析总结 Go语言的pprof工具详解 Go语言作为一个高性能、高并发的编程语言&#xff0c;对性能优化有着极高的要求。在Go语言的标准库中&#xff0c;pprof是一…

架构篇44:互联网架构模板:“平台”技术

文章目录 运维平台测试平台数据平台管理平台小结当业务规模比较小、系统复杂度不高时,运维、测试、数据分析、管理等支撑功能主要由各系统或者团队独立完成。随着业务规模越来越大,系统复杂度越来越高,子系统数量越来越多,如果继续采取各自为政的方式来实现这些支撑功能,会…

回溯大法总结

前言 本篇博客将分两步来进行&#xff0c;首先谈谈我对回溯法的理解&#xff0c;然后通过若干道题来进行讲解&#xff0c;最后总结 对回溯法的理解 回溯法可以看做蛮力法的升级版&#xff0c;它在解决问题时的每一步都尝试所有可能的选项&#xff0c;最终找出所以可行的方案…

对安卓手机上损坏的 SD 卡进行故障排除:恢复提示和修复

概括 如果您总是在旅途中&#xff0c;那么您很可能每天都在使用 SD 卡。这些微小但功能强大的闪存已经变得和手机的内部存储一样有用。它们可以存储数据并移动您想要的任何数据类型&#xff0c;因为它们在 Android 设备上添加了额外的存储空间。不幸的是&#xff0c;他们可能会…

产品推荐 | 基于Xilinx XCKU115的半高PCIe x8 硬件加速卡

一、板卡概述 本板卡系我公司自主研发&#xff0c;采用Xilinx公司的XCKU115-3-FLVF1924-E芯片作为主处理器&#xff0c;主要用于FPGA硬件加速。板卡设计满足工业级要求。如下图所示&#xff1a; 二、功能和技术指标 板卡功能 参数内容 主处理器 XCKU115-3-FLVF1924-E 板卡…

Java网络编程之TCP协议核心机制(三)

题外话 最近学习内容很多嗷 正题 延时应答机制 当客户端发送数据到服务器时,服务器不会立即返回ACK,而是等待一会再返回ACK 这段等待时间应用程序可能会消化掉接收缓冲区中的数据,当服务器返回ACK时,就会携带此时接收缓冲区大小的信息 当客户端下次再发送数据的时候就可以…

JMeter学习笔记一

一、JMeter 背景&#xff1a;移动互联网 -- 小程序 移动APPH5 前后端分离&#xff08;java&#xff0c;C&#xff0c;C#&#xff09; H5 JS Vue 接口测试 (Postman,jmeter,Apifox,ApiPost) 我怎么发送请求&#xff1f; Http接口是一个特殊的URL地址&#xff0c;当有人访问这个地…

Java订餐系统源码 springboot点菜系统源码

Java订餐系统源码 springboot点菜系统源码 源码下载地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介绍&#xff1a; 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&…

SQL刷题笔记day3——第二大值

1题目 我的错误代码&#xff1a; select emp_no,salary from salaries where salary (select salary from salaries group by salary order by salary limit 1,1 ) order by emp_no asc 正确代码&#xff1a; select emp_no,salary from salaries where salary (select sal…

Vita-CLIP: Video and text adaptive CLIP via Multimodal Prompting

标题&#xff1a;Vita-CLIP: 通过多模态提示进行视频和文本自适应CLIP 源文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Wasim_Vita-CLIP_Video_and_Text_Adaptive_CLIP_via_Multimodal_Prompting_CVPR_2023_paper.pdfhttps://openaccess.thecvf.…

代码随想录算法训练营第五十天||309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

文章目录 一、309.最佳买卖股票时机含冷冻期 思路 二、714.买卖股票的最佳时机含手续费 思路 一、309.最佳买卖股票时机含冷冻期 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;…

如何高效创建与配置工程环境:零基础入门

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、工程环境的搭建与准备 二、配置虚拟环境与选择解释器 三、编写代码与自动添加多行注释 …

JVM学习-堆空间(三)

JVM在进行GC时&#xff0c;并非每次都对新生代、老年代、方法区(元空间)三个区域一起回收&#xff0c;大部分时间回收的都是新生代 针对Hotspot VM的实现&#xff0c;它里面的GC按照回收区域分两大类型&#xff1a;一种是部分收集(Partial GC)&#xff0c;一种是整堆收集(Full …

【新】snapd申请Let‘s Encrypt免费SSL证书、自动化续签证书

简介 之前写过一篇certbot申请SSL证书的文章&#xff1a;SSL证书申请&#xff0c;写得比较详细&#xff0c;但是最近发现使用snapd会更方便。 使用机器&#xff1a;Ubuntu 20.04 简单步骤 1、首先安装必要软件 sudo apt install snapd sudo apt install certbot sudo apt …

SQL语言实践

1.数据库 创建 CREATE DATABASE Database; 改名 ALERT DATABASE Data RENAME TO Database; 删除 DROP DATABASE Database; 2.表 创建&#xff1a; CREATE TABLE table(); 与主键&#xff0c;外键有关 CREATE TABLE Table(特殊的主键 serial NOT NULL,外键 …

ICML2024 定义新隐私保护升级:DP-BITFIT新型微调技术让AI模型学习更安全

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;差分隐私在大模型微调中的重要性和挑战 在当今的深度学习领域&#xff0c;大型预训练模型的微调已成为提高各种任务性能的关键技术。然而&am…

Multi-objective reinforcement learning approach for trip recommendation

Multi-objective reinforcement learning approach for trip recommendation A B S T R A C T 行程推荐是一项智能服务&#xff0c;为游客在陌生的城市提供个性化的行程规划。 它旨在构建一系列有序的 POI&#xff0c;在时间和空间限制下最大化用户的旅行体验。 将候选 POI 添…

[OpenGL] 法线贴图

目录 一 为什么要使用法线贴图 二 二种不同法线方式的使用 2.1 插值法线 2.1 法线贴图 本章节源码 点击此处 一 为什么要使用法线贴图 法线贴图我们可以使用更少的顶点表现出同样丰富的细节。高精度网格和使用法线贴图的低精度网格几乎区分不出来。所以法线贴图不仅看起来…

从ES到ClickHouse,Bonree ONE平台更轻更快!

本文字数&#xff1a;8052&#xff1b;估计阅读时间&#xff1a;21 分钟 作者&#xff1a;博睿数据 李骅宸&#xff08;太道&#xff09;& 娄志强&#xff08;冬青&#xff09; 本文在公众号【ClickHouseInc】首发 本系列第一篇内容&#xff1a; 100%降本增效&#xff01;…