网络编程--零拷贝文件传输,网络编程范式
零拷贝1.为什么要有 DMA 技术?在没有 DMA 技术前I/O 的过程是这样的CPU 发出对应磁盘控制器收到指令后于是就开始准备数据会把数据放入到磁盘控制器的内部缓冲区中然后产生一个中断CPU 收到中断信号后停下手头的工作利用中断处理函数完成接着把磁盘控制器的缓冲区的数据一次一个字节地读进自己的寄存器然后再把寄存器里的数据写入到内存。什么是 DMA 技术在进行 I/O 设备和内存的数据传输的时候数据搬运的工作全部交给 DMA 控制器。早期 DMA 只存在在主板上如今由于 I/O 设备越来越多数据传输的需求也不尽相同所以每个 I/O 设备里面都有自己的 DMA 控制器。传统的文件传输有多糟糕代码通常如下一般会需要两个系统调用代码很简单虽然就两行代码但是这里面发生了不少的事情。期间共发生了 4 次用户态与内核态的上下文切换一个系统调用涉及用户态-内核态内核态-用户态算两次。上下文切换到成本并不小一次切换需要耗时几十纳秒到几微秒虽然时间看上去很短但是在高并发的场景下这类时间容易被累积和放大从而影响系统的性能。发生了 4 次数据拷贝第一次拷贝把磁盘上的数据拷贝到操作系统内核的缓冲区里这个拷贝的过程是通过 DMA 搬运的。第二次拷贝把内核缓冲区的数据拷贝到用户的缓冲区里这个拷贝到过程是由 CPU 完成的。第三次拷贝把刚才拷贝到用户的缓冲区里的数据再拷贝到内核的 socket 的缓冲区里这个过程依然还是由 CPU 搬运的。第四次拷贝把内核的 socket 缓冲区里的数据拷贝到网卡的缓冲区里这个过程又是由 DMA 搬运的。要想提高网络文件传输的性能就需要减少「用户态与内核态的上下文切换」和「内存拷贝」的次数。如何实现零拷贝零拷贝技术实现的方式通常有 2 种mmap writesendfilemmap writemmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间这样操作系统内核与用户空间就不需要再进行任何的数据拷贝操作。减少了一次数据拷贝。sendfile在 Linux 内核版本 2.1 中提供了一个专门发送文件的系统调用函数 sendfile()函数形式如下减少了一次系统调用和一次数据拷贝。如果网卡支持 SG-DMAThe Scatter-Gather Direct Memory Access技术和普通的 DMA 有所不同我们可以进一步减少通过 CPU 把内核缓冲区里的数据拷贝到 socket 缓冲区的过程。从 Linux 内核 2.4 版本开始起对于支持网卡支持 SG-DMA 技术的情况下 sendfile() 系统调用的过程发生了点变化具体过程如下第一步通过 DMA 将磁盘上的数据拷贝到内核缓冲区里第二步缓冲区描述符和数据长度传到 socket 缓冲区这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里。减少了一次系统调用两次数据拷贝。大文件传输用什么方式实现先来看看最初的例子当调用 read 方法读取文件时进程实际上会阻塞在 read 方法调用因为要等待磁盘数据的返回如下图对于阻塞的问题可以用异步 I/O 来解决它工作方式如下图通常对于磁盘异步 I/O 只支持直接 I/O。此时异步 I/O 并没有涉及到 PageCache。直接 I/O 应用场景常见的两种应用程序已经实现了磁盘数据的缓存那么可以不需要 PageCache 再次缓存减少额外的性能损耗。在 MySQL 数据库中可以通过参数设置开启直接 I/O默认是不开启由于直接 I/O 绕过了 PageCache就无法享受内核的这两点的优化内核的 I/O 调度算法会缓存尽可能多的 I/O 请求在 PageCache 中最后「合并」成一个更大的 I/O 请求再发给磁盘这样做是为了减少磁盘的寻址操作内核也会「预读」后续的 I/O 请求放在 PageCache 中一样是为了减少对磁盘的操作网络编程1.select将已连接的 Socket 都放到一个文件描述符集合然后调用 select 函数将文件描述符集合拷贝到内核里让内核来检查是否有网络事件产生。检查的方式很粗暴就是通过遍历文件描述符集合的方式当检查到有事件产生后将此 Socket 标记为可读或可写。接着再把整个文件描述符集合拷贝回用户态里。用户态还需要再通过遍历的方法找到可读或可写的 Socket然后再对其处理。需要 2 次「遍历」文件描述符集合2 次「拷贝」文件描述符集合。select 使用固定长度的 BitsMap表示文件描述符集合而且所支持的文件描述符的个数是有限制的在 Linux 系统中由内核中的 FD_SETSIZE 限制 默认最大值为 1024只能监听 0~1023 的文件描述符。2.poll过程类型。需要 2 次「遍历」文件描述符集合2 次「拷贝」文件描述符集合。poll 不再用 BitsMap 来存储所关注的文件描述符取而代之用动态数组以链表形式来组织突破了 select 的文件描述符个数限制当然还会受到系统文件描述符限制。3.epollepoll 通过两个方面很好解决了 select/poll 的问题。第一点epoll 在内核里使用红黑树来跟踪进程所有待检测的文件描述字把需要监控的 socket 通过 epoll_ctl() 函数加入内核中的红黑树里。这样避免了select/poll每次执行检测需要全量拷贝问题。第二点 epoll 使用事件驱动的机制内核里维护了一个链表来记录就绪事件当某个 socket 有事件发生时通过回调函数内核会将其加入到这个就绪事件列表中当用户调用 epoll_wait() 函数时只会返回有事件发生的文件描述符的个数。避免了select/poll每次检测需要全量扫描问题。边缘触发和水平触发epoll 支持两种事件触发模式分别是边缘触发edge-triggeredET和水平触发level-triggeredLT。这两个术语还挺抽象的其实它们的区别还是很好理解的。使用边缘触发模式时当被监控的 Socket 描述符上有可读事件发生时服务器端只会从 epoll_wait 中苏醒一次。使用水平触发模式时当被监控的 Socket 上有可读事件发生时服务器端不断地从 epoll_wait 中苏醒直到内核缓冲区数据被 read 函数读完才结束。

相关新闻

如何快速搭建智能媒体库:MetaTube插件为Jellyfin/Emby打造的终极元数据管理方案

如何快速搭建智能媒体库:MetaTube插件为Jellyfin/Emby打造的终极元数据管理方案

如何快速搭建智能媒体库:MetaTube插件为Jellyfin/Emby打造的终极元数据管理方案 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube 在当今数字媒体时代&…

2026/8/4 19:03:23 阅读更多 →
联合查询SQL注入攻击原理与防御实战

联合查询SQL注入攻击原理与防御实战

1. 联合查询注入的本质与攻击逻辑联合查询注入(Union-Based SQL Injection)是SQL注入攻击中最经典且高效的技术手段之一。这种攻击方式的核心在于利用SQL语句中的UNION操作符,将恶意构造的查询语句拼接到原始查询中,从而获取数据库…

2026/8/3 11:01:46 阅读更多 →
C++与C#中using、命名空间与作用域解析符的深度对比与实践指南

C++与C#中using、命名空间与作用域解析符的深度对比与实践指南

1. 项目概述:当C老炮遇上C#新贵 在跨语言开发或者技术栈迁移的日常里,我经常遇到一个有趣的现象:很多从C转向C#的朋友,或者反过来,都会对 using 这个关键字产生一种“似曾相识却又处处不同”的困惑。在C里&#xff0…

2026/8/3 11:00:46 阅读更多 →

最新新闻

教培团灭之后,我在十个人的小外包里把自己重新长了一遍

教培团灭之后,我在十个人的小外包里把自己重新长了一遍

那年夏天,整层楼的工牌一夜之间作废 我在郑州一家教培公司做前端,两年多。学科类的那种,做的是家长端 App 里的一堆页面:课程表、错题本、直播间的互动组件。工作不算光鲜,但稳定,每个月十五号工资准时到账…

2026/8/4 19:02:36 阅读更多 →
我做了四年的低代码,被 AI 一把梭了

我做了四年的低代码,被 AI 一把梭了

那个演示会,我看了三遍回放 今年三月,公司开季度会。老板投屏演示一个 AI 生成工具,输入"做一个带审批流的报销系统,三个角色,移动端适配",四十秒,页面、表单、权限、流程图&#xf…

2026/8/4 19:02:36 阅读更多 →
3步掌握电子课本下载:国家中小学智慧教育平台资源获取终极指南

3步掌握电子课本下载:国家中小学智慧教育平台资源获取终极指南

3步掌握电子课本下载:国家中小学智慧教育平台资源获取终极指南 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 …

2026/8/4 19:02:36 阅读更多 →
JSON.lua实战指南:掌握Lua最轻量JSON解析库的高效应用

JSON.lua实战指南:掌握Lua最轻量JSON解析库的高效应用

JSON.lua实战指南:掌握Lua最轻量JSON解析库的高效应用 【免费下载链接】json.lua A lightweight JSON library for Lua 项目地址: https://gitcode.com/gh_mirrors/js/json.lua JSON.lua是一个专为Lua语言设计的轻量级JSON解析库,采用纯Lua实现&a…

2026/8/4 19:02:36 阅读更多 →
Linux系统Python安装与多版本管理实战指南

Linux系统Python安装与多版本管理实战指南

1. Linux系统安装Python全流程指南 在Linux环境下安装Python是每个开发者都会遇到的基础操作,但看似简单的过程里藏着不少门道。我经历过从Ubuntu到CentOS各种发行版的Python环境配置,也踩过不少坑。今天就把这些实战经验整理成一份保姆级教程&#xff0…

2026/8/4 19:02:36 阅读更多 →
图书管理系统CRUD实战:PHP+MySQL开发指南

图书管理系统CRUD实战:PHP+MySQL开发指南

1. 图书管理系统中的增删改查实战指南在各类管理系统的开发中,增删改查(CRUD)是最基础也最核心的功能模块。以图书管理系统为例,这四项操作构成了整个应用的数据骨架。我经手过十几个图书管理项目,发现很多新手开发者容…

2026/8/4 19:01:36 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →