mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景,其中一个典型的应用场景是网络文件传输。

假设我们需要将一个大文件传输到远程服务器上。在传统的方式下,我们可能需要将文件内容读入内存,然后再将数据从内存复制到网络协议栈中,最终发送到远程服务器。这个过程中,涉及到了多次数据拷贝操作,增加了 CPU 的开销,降低了传输效率。

而使用 mmap 零拷贝技术,则可以将文件映射到内存中,然后直接将内存中的数据传输到网络协议栈中,避免了数据在内核和应用程序之间的复制,从而提高了传输效率。

具体实现步骤如下:

  1. 使用 open 系统调用打开文件,并获取文件描述符。
  2. 使用 fstat 系统调用获取文件的大小。
  3. 使用 mmap 系统调用将文件映射到内存中,并获取映射的地址和长度。
  4. 将内存中的数据传输到网络协议栈中,可以使用 sendto 系统调用将数据直接传输到网络中。
  5. 使用 munmap 系统调用解除内存映射。

通过使用 mmap 零拷贝技术,我们可以将文件内容直接传输到网络中,避免了数据在内核和应用程序之间的复制,提高了传输效率。这种技术在文件传输、多媒体流传输等场景下都可以发挥重要作用。

在这里插入图片描述

参数说明
  1. 参数fd为即将映射到内存空间的文件描述符,一般由open返回。同时fd也可以指定为-1,此时须指定flags参数中的MAP_ANON,表名进行的是匿名映射。
  2. len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。
  3. prot参数指定共享内存的访问权限,可指定为
    PROT_NONE:映射区不可访问
    或者以下几个值的或:
    PROT_READ:可读
    PROT_WRITE:可写
    PROT_EXEC:可执行
  4. flags参数影响映射存储区的多种属性:
    MAP_FIXED: 返回值必须等于addr。因为这不利于可移植性,所以不建议使用此标志。如果未指定此标志,而且addr非0,则内核只把addr视为在何处设置映射区的一种建议,但是不保证会使用所要求的地址。将addr指定为0可获得最大可移植性。
    MAP_SHARED: 这一标志说明了本进程对映射区所进行的存储操作的配置。此标志指定存储操作修改映射文件,也就是说,存储操作相当于对该文件的write。
    MAP_PRIVATE: 本标志说明,对映射区的存储操作导致创建该映射文件的一个私有副本。所有后来对该映射区的引用都是引用该副本,而不是原始文件。(此标志的一种用途是用于调试程序,它将一程序文件的正文部分映射至一存储区,但允许用户修改其中的指令。任何修改只影响程序文件的副本,而不影响原文件)。
  5. offset参数一般设置为0,表示从文件头开始映射,必须是page size的倍数。
  6. 参数addr指定文件应被映射到进程空间的起始地址,一般被指定为一个空指针,此时选择起始地址的任务留给内核来完成。返回值为最后文件映射到进程空间的起始地址,进程可以直接操作该地址。

以下是一个简单的 C 语言示例,演示了如何使用 mmap 和 sendto 进行文件传输,实现零拷贝:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <arpa/inet.h>#define SERVER_IP "192.168.1.100"
#define SERVER_PORT 8888int main() {int fd;struct stat sb;char *addr;// 打开文件fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");exit(EXIT_FAILURE);}// 获取文件信息if (fstat(fd, &sb) == -1) {perror("fstat");exit(EXIT_FAILURE);}// 将文件映射到内存addr = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);if (addr == MAP_FAILED) {perror("mmap");exit(EXIT_FAILURE);}// 创建 socketint sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket");exit(EXIT_FAILURE);}// 设置服务器地址struct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);// 直接发送数据到网络sendto(sockfd, addr, sb.st_size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));// 解除内存映射if (munmap(addr, sb.st_size) == -1) {perror("munmap");exit(EXIT_FAILURE);}// 关闭文件和套接字close(fd);close(sockfd);return 0;
}

这个示例演示了如何打开文件,将文件映射到内存,然后直接通过 sendto 函数将数据发送到指定的网络地址。在这个过程中,避免了数据在内核和应用程序之间的复制操作,实现了零拷贝的效果。

mmap (Memory Mapped Files) 技术可以应用于多个场景:

  1. 文件传输:可以将文件映射到内存中,然后直接将内存中的数据传输到网络协议栈中,避免了数据在内核和应用程序之间的复制,提高了传输效率。
  2. 数据库管理:可以将数据库中的数据映射到内存中,从而加快数据的读取速度,并且避免了频繁的 I/O 操作。
  3. 大数据处理:可以将大量的数据映射到内存中,以便进行快速的数据处理和计算。
  4. 内存数据库:可以将内存中的数据映射到文件中,从而实现快速的数据持久化和恢复。

总之,mmap 技术可以应用于需要快速读取和处理大量数据的场景,能够提高系统的性能和响应速度。

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

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

相关文章

【点云】生成有凹凸的平面

文章目录 前言高斯函数原理代码保存 测试测试1 &#xff1a;领域曲率代码测试2&#xff1a;高斯曲率代码 加上噪点测试1测试2改进 前言 尝试用一些数据生成有凹凸面的点云。 我们姑且把z轴当成有凹凸的缺陷&#xff0c;x轴和y轴共同组成一个平面。 高斯函数 原理 高斯函数wi…

Leetcode-976. 三角形的最大周长

题目&#xff1a; 给定由一些正数&#xff08;代表长度&#xff09;组成的数组 nums &#xff0c;返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形&#xff0c;返回 0。 示例 1&#xff1a; 输入&#xff1a;nums [2,1,2] 输出…

掘根宝典之C++类模板大全

1 类模板语法 类模板的作用&#xff1a;建立一个通用类&#xff0c;类中的成员数据类型可以不具体制定&#xff0c;用一个虚拟的类型来代表 语法&#xff1a; template<typename T> 模板类声明 解释&#xff1a;template声明创建模板 typename表明其后面的符号是一种数…

UE4 C++联网RPC教程笔记(一)(第1~4集)

UE4 C联网RPC教程笔记&#xff08;一&#xff09;&#xff08;第1~4集&#xff09; 前言1. 教程介绍与资源2. 自定义 Debug 功能3. Actor 的复制4. 联网状态判断 前言 本系列笔记将会对梁迪老师的《UE4C联网RPC框架开发吃鸡》教程进行个人的知识点梳理与总结&#xff0c;此课程…

ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)

在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中&#xff0c;作者对异常处理整体流程以及相关概念做了梳理。接下来&#xff0c;本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…

sdxl-turbo、playground文生图模型使用案例

1、sdxl-turbo SDXL-Turbo是一种快速生成的文本到图像模型,可以在单个网络评估中从文本提示合成逼真的图像。 参考:https://huggingface.co/stabilityai/sdxl-turbo 对比效果相比PixArt模型差很多,参考https://blog.csdn.net/weixin_42357472/article/details/135520142 …

axios

2022年10月11日&#xff0c;在《AXAJ与JavaScript中的异步编程元素》文章中我总结了对于前端开发者中需要了解和掌握的8种异步编程元素&#xff0c;其中XMLHTTPRequest很关键&#xff0c;它是原生JavaScript提供的用于发送 HTTP 请求的对象&#xff0c;用于在前端与服务器进行数…

「C++ 内存管理篇 0」C和C++对内存的划分

目录 一、C和C对内存的划分 二、小测试 【题目】 【答案】 【解释】 一、C和C对内存的划分 1. 栈区 &#xff1a;存储非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2. 共享区&#xff1a;用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

网络编程_TCP通信综合练习:

1 //client&#xff1a;&#xff1a; public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket snew Socket("127.0.0.1",10000);//获取输出流OutputStream op s.getOutput…

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

linux 实用技能

1.查看系统版本 cat /etc/redhat-release cat /etc/redhat-release 2. 查看磁盘实用情况 df du 3.查看内存 top -Hp 2214 4. 网络配置 vi /etc/hostname vi /etc/hosts vi /etc/sysconfig/network-scripts/ifcfgens33 6. sed ‘s/a/b/g’ aaa.txt 替换 7. scp …

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

ACM/NOI/CSP比赛经验分享

ACM/NOI/CSP比赛经验分享 一、引言 在信息学竞赛的舞台上&#xff0c;ACM/ICPC、NOI和CSP是众多学子梦寐以求的赛事。这些比赛不仅考验了参赛者的算法和数据结构知识&#xff0c;更是对团队协作、时间管理和心理素质的全面挑战。作为一名曾经参与过这些比赛的选手&#xff0c…

最新 Vue3、TypeScript、组合式API、setup语法糖 学习笔记

最新 Vue3、TypeScript、组合式API、setup语法糖 学习笔记 1、创建 Vue3 工程基于 `vue-cli` 创建(基于webpack实现)基于 `vite` 创建(推荐)2、Vue3 项目开发 `vscode` 插件推荐3、`Vue3` 核心语法【optionsAPI】与【CompositionAPI】Options API 的弊端Composition API 的…

洛谷 P8630 [蓝桥杯 2015 国 B] 密文搜索

题目描述 福尔摩斯从 X 星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为 8 的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏…

K8S更新部署docker的两种方法举例

前提条件 imagePullPolicy: Always 方法1&#xff1a;删除更新法 test-project为命名空间 --删除所有asp-svc下面的pod,这会导致从新拉取镜像 kubectl delete pods -l appasp-svc -n test-project --删除指定的pod&#xff0c;这会导致从新拉取镜像 kubectl delete pod …