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

mmap映射、sendfile

mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数传统文件的IO方式传统文件读写主要是调用read和write系统调用与内核进行交互数据先从磁盘通过DMA直接内存访问技术到达内核态缓冲区内核态缓冲区又会通过拷贝到达用户缓冲区期间会发生4次拷贝4次上下文切换mmap代替传统IO中的read操作相当于mmapwrite减少了一次cpu的拷贝就是把读缓冲区的地址与用户缓冲区的地址进行映射“用户态”与“内核态”共享这里就体现了从内核态的读缓冲区到用户缓冲区的一次cpu拷贝这个IO方式变为4次内核态切换mmap两次write两次3次拷贝mmap流程1.用户态调用mmap上下文从用户态变为内核态建立地址映射2、DMA把数据从硬盘拷贝到读缓冲区3、上下文从内核态转为用户态mmap调用返回4、调用write方法上下文从用户态转为内核态5、cpu将用户缓冲区的数据拷贝到socket缓冲区并通过DMA复制给硬盘6、上下文从内核态切换为用户态write返回优点1、将用户缓冲区内存是虚拟的只是与内核读缓冲区映射可以节省一半的内存空间适合大文件传输2、减少了一次从内核态读缓冲区到用户态缓冲区的cpu拷贝用内存读写代替了IO读写减少了read系统调用效率高。函数原型#include sys/mman. h void *mmap (void *addr, size_t len, int prot, int flag, int filedes, off_t off) ; /* addr: 指定映射的起始地址。通常设为 NULL由内核决定映射区域的具体位置。 len: 映射到地址空间中的字节数长度。必须为页大小的整数倍 prot: 映射区域的保护方式。可以使用 PROT_NONE 或以下常量的按位或 PROT_READ: 页面可读。 PROT_WRITE: 页面可写。 PROT_EXEC: 页面可执行。--动态库 flag: 影响映射区域的各种特性 MAP_SHARED: 对映射区域的写入数据会复制回文件并允许其他进程共享。 MAP_PRIVATE: 建立一个写入时拷贝Copy-on-Write的私有映射写入不会修改原文件。 MAP_ANONYMOUS: 匿名映射不关联任何文件此时 filedes 忽略。 filedes: 要映射的文件描述符。 off: 文件映射的偏移量通常需要是分页大小的整数倍。 返回值 成功: 返回指向映射区域的指针。 失败: 返回宏 MAP_FAILED (即 (void *)-1)并设置 errno */ int munmap (void *addr, size_t len) ; /* addr: 由 mmap 返回的起始地址。 len: 映射区域的大小。 返回值 成功: 返回 0。 失败: 返回 -1并设置 errno。 */注意事项1、调用mmap时系统会把文件立即读进内存吗不会mmap只是建立地址映射关系不会立即发生磁盘IO数据真正加载是在cpu首次访问这段地址时会触发缺页中断所以mmap是用到哪一页才加载哪一页2、mmap向应用程序提供的内存访问接口是内存地址连续的,但是对应的磁盘文件的block可以不是地址连续的3、mmap提供的内存空间是虚拟空间(虚拟内存),而不是物理空间(物理内存),因此完全可以分配远远大于物理内存大小的虚拟空间4、mmap由操作系统负责管理,对同一个文件地址的映射将被所有线程共享,操作系统确保线程安全以及线程可见性sendfilemmap虽然减少了一次从内核态到用户态的cpu拷贝但还是进行了4次上下文切换还是有开销的现在sendfile方法减少了2次上下文切换使用sendfile数据可以直接在内核空间中进行传播避免了用户空间与内核空间的拷贝又因为sendfile代替了readwrite节省了一次系统调用减少了两次上下文的切换sendfile流程1、用户通过sendfile方法发起系统调用从用户态切换为内核态2、DMA从硬盘拷贝到读缓冲区3、cpu将读缓冲区的数据拷贝到socket缓冲区4、DMA把数据从socket从socket缓冲区拷贝到网卡5、上下文从内核态切换为用户态sendfile返回使用情况通过上面的流程数据对用户空间完全不可见不需要用户空间操作的情况函数原型#include sys/sendfile.h ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); /* out_fd: 输出文件描述符。数据将被写入此处。在 Linux 2.6.33 之前它必须是一个 Socket此后也可以是普通文件。 in_fd: 输入文件描述符。数据将从此读取。它必须指向支持类似 mmap 操作的文件通常是磁盘上的普通文件。 offset: 指向偏移量变量的指针。 如果为 NULL从文件的当前偏移量开始读取并自动更新文件指针。 如果不为 NULL指向一个起始位置。函数执行后该变量会被更新为传输后的新位置但不会改变 in_fd 原有的文件指针。 count: 打算在两个文件描述符之间传输的字节数。 返回值 成功: 返回实际写入 out_fd 的字节数ssize_t。失败: 返回 -1并设置 errno。 */总结传输方式DMA 拷贝 (硬件与内核)CPU 拷贝 (内核与用户)上下文切换 (状态转换)性能评价传统 IO(read/write)2 次2 次4 次效率最低数据需要在内核和用户空间反复搬运。mmap(内存映射)2 次1 次4 次中等减少了 1 次 CPU 拷贝但上下文切换次数依然较多。sendfile()(零拷贝)2 次1 次2 次效率最高不仅减少了 CPU 拷贝还大幅降低了上下文切换开销。

相关文章:

mmap映射、sendfile

mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址, 对文件的读写可以直接用指针来做而不需要read/write函数传统文件的IO方式传统文件读写主要是调用read和write系统调用与内核进行交互,数据先从磁盘通过DMA(直接内存访…...

Moveit2(Jazzy)集成OMPL自定义SRRT算法实战

1. 从零开始编译OMPL源码 在机械臂运动规划领域,OMPL(Open Motion Planning Library)堪称算法宝库。但当你发现标准RRT、PRM等算法无法满足高自由度机械臂的规划需求时,就需要祭出大杀器——自定义SRRT算法。下面我会手把手带你完…...

UE5 + AirSim + ROS联合开发:如何在WSL2中实现无缝通信(保姆级教程)

UE5 AirSim ROS联合开发:WSL2环境下的高效通信实战指南 机器人仿真与自动驾驶研究正迎来技术融合的新阶段。当虚幻引擎5(UE5)的高保真渲染能力遇上AirSim的物理仿真特性,再结合ROS的机器人控制框架,开发者能够构建出…...

特斯拉机器人开发笔记:用Python模拟Optimus 2.0的强化学习决策过程(PyTorch版)

特斯拉机器人开发实战:用PyTorch构建Optimus 2.0的DQN导航系统 当人形机器人需要在复杂家庭环境中自主决策时,强化学习算法就像给机器装上了"数字大脑"。本文将带您从零开始,用PyTorch实现一个简化版的Optimus导航决策系统&#xf…...

计算斐波纳契数列时Python 浮点数精度损失问题

一、问题根源 使用比内公式计算的时候代码用 Python 浮点数(float,双精度 64 位)计算比内公式,在 n100 时,phi**n 和 psi**n 数值差异极大,导致减法时有效位丢失,最终结果出现误差。 二、解决精…...

LTE基站扫描原理拆解:如何用OpenCL加速PSS信号检测

LTE基站扫描中的PSS信号检测:从数学原理到OpenCL加速实战 引言 在移动通信领域,LTE基站扫描技术一直是工程师和研究者的关注焦点。这项技术不仅关系到网络优化和频谱监测,更是理解无线通信物理层运作的绝佳窗口。传统手机通过复杂的专用芯片完…...

Guohua Diffusion 进阶教程:利用LSTM网络优化图像生成序列连贯性

Guohua Diffusion 进阶教程:利用LSTM网络优化图像生成序列连贯性 你是不是遇到过这样的问题?用Guohua Diffusion生成单张图片效果很棒,但想让它画一个四格漫画,或者生成一个故事里不同场景的配图时,出来的画面风格却五…...

角点特征检测技术:Harris与Harris-Laplace算法研究

👨‍🎓 博主简介:博士研究生 🔬 超级学长:超级学长实验室(提供各种程序开发、实验复现与论文指导) 📧 个人邮箱:easy_optics126.com 💬 个人微信&#…...

STM32 GPIO模拟OneWire协议实战:手把手教你与DS2431 EEPROM通信

STM32 GPIO模拟OneWire协议实战:手把手教你与DS2431 EEPROM通信 在嵌入式系统开发中,与各种外设的通信是工程师们经常需要面对的挑战。当项目需要连接多个传感器或存储设备时,传统的I2C、SPI等总线协议虽然常见,但在某些特定场景下…...

Qwen3-TTS在教育场景落地:AI教师多语种发音训练工具搭建实战

Qwen3-TTS在教育场景落地:AI教师多语种发音训练工具搭建实战 想象一下,一位能流利切换十种语言、发音标准、情感饱满的AI教师,正在为你的学生进行一对一的发音训练。这不再是科幻电影里的场景,而是我们今天就能用Qwen3-TTS-12Hz-…...

SC16IS7XX UART扩展库:工业级双通道串口驱动详解

1. 项目概述Appnostic SC16IS7XX Arduino Library 是一款面向嵌入式硬件工程师的工业级 UART 扩展驱动库,专为 NXP 半导体推出的 SC16IS750、SC16IS751 和 SC16IS752 系列双通道/单通道异步收发器芯片设计。该系列芯片本质是高度集成的“UART-to-Bus”桥接器&#x…...

GLM-Image边缘计算:在终端设备上实现图像生成

GLM-Image边缘计算:在终端设备上实现图像生成 让AI图像生成能力从云端走向终端,释放边缘计算的无限可能 你有没有遇到过这样的情况:想要快速生成一张产品展示图,但网络不稳定导致云端服务响应缓慢;或者需要处理敏感图片…...

Python新手入门:一下看懂try-except异常处理

你是不是写 Python 时经常遇到: 1.程序跑一半突然报错 2.输入数字变成字符串、除 0、文件找不到 3.一出错整个程序直接崩掉,后面代码都不跑了今天用最简单、最新手友好的方式,带你彻底学会 try except ——Python 里专门用来抓错误、防崩溃的…...

SEO_2024年最有效的SEO实战技巧与方法全解析

2024年最有效的SEO实战技巧与方法全解析在当今竞争激烈的互联网环境中,如何有效提升网站的搜索引擎优化(SEO)已成为每个网站运营者的首要任务。2024年,SEO的技术和策略也在不断演变。本文将详细探讨2024年最有效的SEO实战技巧与方…...

脑机离婚案:妻子要求分割我的记忆云盘——软件测试视角下的数字资产分割挑战

未来离婚案的科技困局在2050年,脑机接口(BMI)技术已普及,人类记忆可上传至“记忆云盘”,成为个人数字资产的核心部分。作为软件测试工程师,我在NeuroTech公司负责BMI系统的安全测试。当妻子提起离婚诉讼&am…...

ILI9341 TFT驱动开发:8080并口嵌入式图形库实战

1. 项目概述AitendoTFT 是一款专为 Aitendo 公司推出的 2.6 英寸 TFT LCD 扩展板设计的嵌入式图形驱动库,原生支持 Arduino UNO(ATmega328P)与 STMicroelectronics STM32 Nucleo 系列开发板(如 NUCLEO-F401RE、NUCLEO-F411RE&…...

Arduino R4 WiFi 12×8点阵数字显示库:零依赖轻量级实现

1. 项目概述Pantalla12x8 是一个专为 Arduino R4 WiFi 平台设计的轻量级图形显示库,面向物理尺寸为 128 像素的单色点阵显示屏。该库不依赖任何外部显示驱动芯片(如 MAX7219、HT16K33)或复杂图形框架,而是直接以位图数据形式驱动硬…...

【第三十七周】论文阅读03

文章目录摘要Abstract一、《LLaVA-Scissor: Token Compression with Semantic Connected Components for Video LLMs》1. 摘要2. 介绍3. 相关工作4. Llava-删除5. 实验5.1 压缩类型5.2 令牌压缩中的递减规律二、FastVLM: Efficient Vision Encoding for Vision Language Models…...

SEO_快速诊断并解决网站SEO问题的五个步骤(384 )

SEO:快速诊断并解决网站SEO问题的五个步骤在当今的互联网时代,网站的SEO优化已经成为提升网站流量、吸引更多潜在客户的关键。面对复杂多变的搜索引擎算法,很多网站主都会遇到各种各样的SEO问题。本文将为大家详细介绍五个步骤,帮助你快速诊断…...

Qwen2.5-VL-7B-Instruct开源可部署优势:完全离线运行,无外网依赖保障安全

Qwen2.5-VL-7B-Instruct开源可部署优势:完全离线运行,无外网依赖保障安全 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款强大的多模态视觉-语言模型,能够同时处理图像和文本输入,生成高质量的文本输出。这个开源模型最突出的特点是…...

保姆级教程:用MATLAB 2022b和STM32G431RB搞定无感FOC,从电机参数识别到代码生成

从零构建无感FOC系统:MATLAB与STM32G431RB的深度实践指南 引言:为什么选择无感FOC技术? 在电机控制领域,磁场定向控制(FOC)因其高效率、低噪音和精准控制特性,已成为工业界和学术界的黄金标准。而无需位置传感器的无感…...

【OpenClaw从入门到精通】第37篇:教育“龙虾”进化论——从答疑助教到全流程智能教学系统(2026实测版)

摘要:2026年,教育AI已从被动答疑的L1级进化至主动教学的L4级,清华开源的OpenMAIC平台更是打破传统慕课局限,实现互动式AI课堂。本文基于天津工业大学、西北农林科技大学等高校的真实应用案例,结合腾讯云、天翼云的实操指南,详解OpenClaw在教育场景的四层进化路径。核心内…...

树形DP

前言 顾名思义树上的DP 树是一种数据结构 DP (动态规划) 是一种算法 接下来我将用洛谷上的 P2052 来向你讲解 P2052 P2052 [NOI2011] 道路修建 - 洛谷 题意:给一棵树,计算n-1条边,每条边两边节点相减的绝对值乘边权。 思路:用DFS…...

在 Debian 13 (Trixie) 上安装远程桌面 Xrdp 并配置 Xfce4

在 Debian 13 (Trixie) 上安装 Xrdp 并配置 Xfce4 桌面,可以让你通过 Windows 自带的远程桌面工具流畅访问 Linux 桌面。相比 VNC,RDP 协议在体验上更接近原生系统,而且无需在客户端安装额外软件。 下面是一个完整的操作流程,按顺序执行即可。 第一步:更新系统 在开始安…...

SmolVLA助力网络安全:智能分析日志与威胁情报

SmolVLA助力网络安全:智能分析日志与威胁情报 最近和几个做安全运维的朋友聊天,他们都在抱怨同一个问题:每天面对海量的系统日志、告警信息和五花八门的威胁情报报告,眼睛都快看花了,关键信息还总是被淹没在噪音里。一…...

合宙Air780EG开发板实战指南—06 基于LuatOS的串口UART高效数据收发与调试技巧

1. 串口通信基础与硬件准备 串口通信是嵌入式开发中最基础也最重要的功能之一。合宙Air780EG开发板内置了多个UART接口,其中MAIN_UART通常作为主通信接口。在实际项目中,我经常用它连接传感器、显示屏或其他外设。对于刚接触串口开发的朋友,可…...

SEO_掌握关键词研究的正确方法,驱动SEO流量增长

SEO流量增长的关键:掌握关键词研究的正确方法在当前竞争激烈的互联网市场中,掌握关键词研究的正确方法是推动SEO流量增长的核心。掌握关键词研究不仅能帮助你更好地了解用户需求,还能让你在搜索引擎中获得更高的排名。本文将从问题分析、原因…...

Java类间变量共享与进度更新的实现策略

本文旨在探讨如何在Java中安全有效地共享和更新不同操作类别之间的变量值,特别是在需要实时监控操作进度的场景中。我们将通过三种核心策略-观察者模式(推动模型)、轮询模式(拉模式)和基于多线程的共享状态管理——详细说明如何实现类间通信和…...

网络协议分析(CTF 入门博客)

一、什么是网络协议分析网络协议分析,就是对网络传输过程中捕获的流量数据包(通常是 .pcap 或 .pcapng 文件)进行查看、筛选、追踪和解码,从中找到关键信息。在 CTF 中,这类题目通常会给一个抓包文件,我们的…...

DM8数据库容灾避坑手册:从备份恢复到应急方案的全套操作实录(含PSEG_RECV参数详解)

DM8数据库容灾实战指南:关键文件恢复与PSEG_RECV参数深度解析 在数据库运维领域,容灾能力直接决定了业务系统的可靠性天花板。达梦DM8作为国产数据库的领军产品,其恢复机制设计既遵循经典数据库理论,又融入了独特的工程实现。本文…...