mmap映射文件使用示例

这篇具有很好参考价值的文章主要介绍了mmap映射文件使用示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

具体实现步骤如下:

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

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

mmap映射文件使用示例,# Linux C高阶,计算机,软件工程,软件开发,c++

参数说明
  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 8888

int 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);
    }

    // 创建 socket
    int 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 技术可以应用于需要快速读取和处理大量数据的场景,能够提高系统的性能和响应速度。文章来源地址https://www.toymoban.com/news/detail-828439.html

到了这里,关于mmap映射文件使用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【IMX6ULL驱动开发学习】19.mmap内存映射

    mmap将一个文件或者其它对象映射进内存 ,使得应用层可以直接读取到驱动层的数据,无需通过copy_to_user函数 可以用于像LCD这样的外设, 需要读写大量数据的 一、应用层 mmap用法: 用open系统调用打开文件, 并返回描述符fd. 用mmap建立内存映射, 并返回映射首地址指针start. 对映

    2024年02月16日
    浏览(52)
  • 【计算机组成原理·笔记】Cache主存映射和辅存

    主存中的任意一个块,对映指定的一个 cache块,但 一个 cache块 可以对映多个主存块,在 cache的标记中,有标记标识当前 cache块对应着哪些主存区块。 利用率较低,可能会冲突 主存任意的一块,可以被放入 cache中的任意的一个块中。 利用率高 查询速度慢,查询某主存块是否

    2024年02月08日
    浏览(47)
  • 【计算机组成原理】高速缓冲存储器 Cache 的三种映射方式(Cache Mapping)

    缓存是计算机系统中常见的一种高速存储器,用于临时存储常用数据,以便快速访问。在缓存中,有三种常见的映射方式,分别是直接映射、全相联映射和组相联映射。 在直接映射中,每个主存块只能映射到缓存中的一个特定位置。该位置是通过对主存块的某个地址的一部分

    2024年01月19日
    浏览(50)
  • 计算机网络安全--snort介绍--linux下安装和使用

    本文章教程使用的是WSL的 Ubuntu 22.04.1 LTS 系统 且使用的管理员账户 Snort是世界上最重要的开源入侵防御系统(IPS)。Snort IPS使用一系列规则 帮助定义恶意网络活动,并使用这些规则查找与它们匹配的数据包,以及 为用户生成警报。 Snort也可以内联部署以阻止这些数据包。鼻

    2023年04月08日
    浏览(38)
  • 【计算机视觉 | 目标检测】目标检测中的评价指标 mAP 理解及计算(含示例)

    在目标检测中,有几个常用的评价指标用于衡量算法的性能。以下是其中几个重要的评价指标: Precision(精确率):Precision 衡量了在所有被检测为正样本的样本中,有多少是真正的正样本。 Precision 的计算公式为:Precision = TP / (TP + FP),其中 TP 是真正的正样本数量,FP 是将负

    2024年01月19日
    浏览(52)
  • Linux 可执行文件瘦身指令 strip 使用示例

    以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/lJ8vj-FszEoplMVcmT0I0w 在 Linux 系统下开发软件,输出的可执行文件可大可小,运行环境如果是在服务器那么可能资源比较充足,但如果是在嵌入式环境,那么存储资源是寸土必争

    2024年02月11日
    浏览(37)
  • 【计算机视觉】GFLOPs、FLOPS和FLOPs的区别和联系(含代码示例)

    这三个概念其实都差不多,都涉及浮点运算,但是还是有一些小的不同之处,下面简单总结一下: GFLOPS 就是 Giga Floating-point Operations Per Second,即每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理

    2024年02月03日
    浏览(40)
  • linux下下载文件的常用命令wget,curl等使用方法及使用示例

    在 Linux 操作系统中,有许多下载文件的工具可供选择。这些工具包括命令行工具和图形界面工具,每个工具都有其自身的特点和用途。以下是一些常用的下载文件工具: wget :一个功能强大的命令行下载工具,支持 HTTP、HTTPS、FTP 等协议,能够断点续传、递归下载等。 curl :

    2024年04月17日
    浏览(83)
  • 【计算机视觉】Fast Segment Anything 安装步骤和示例代码解读(含源代码)

    论文地址: 快速分段任意模型 (FastSAM) 是一种 CNN 分段任意模型,仅由 SAM 作者发布的 SA-1B 数据集的 2% 进行训练。 FastSAM 的性能与 SAM 方法相当,运行速度提高了 50 倍。 该代码需要 python=3.7 ,以及 pytorch=1.7 和 torchvision=0.8 。 请按照此处的说明安装 PyTorch 和 TorchVision 依赖项。

    2024年02月13日
    浏览(47)
  • Linux下mmap

    目录 一.mmap简介 二.为什么需要使用mmap 三.mmap的使用 四.mmap原理 什么是mmap了?从名字上来看是memory map也就是地址映射,是一种内存映射文件的方法。mmap是一个可以将一个文件或者其它对象映射到进程的地址空间实现磁盘的地址和进程虚拟地址空间一段虚拟地址的一一对应关

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包