零拷贝技术

背景

        磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,也可以有效的减少磁盘的访问次数。

传统的数据传输方式

如果服务端提供数据传输功能,传统方式:将文件从磁盘上读取出来,然后通过网络协议写入,发送给客户端。

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

其中涉及到的内部流程如下:

  • 第一次拷贝(DMA拷贝):把数据从磁盘上拷贝到操作系统内核缓冲区。
  • 第二次拷贝(CPU拷贝):把内核缓冲区的数据拷贝到用户缓冲区,此时我们的程序就可以使用读到的数据
  • 第三次拷贝(CPU拷贝):把用户缓冲区的数据再拷贝到内核的socket缓冲区(套接字缓冲区)。
  • 第四次拷贝(DMA拷贝):把内核的socket缓冲区数据拷贝到网卡缓冲区中。

零拷贝方式

  • 第一次拷贝(DMA拷贝):通过DMA技术将磁盘数据拷贝到内核缓冲区中。
  • 第二次拷贝(DMA拷贝):内核缓冲区的“描述符”+“长度”传到socket缓冲区,然后SG-DMA控制器可直接将内核缓冲区中的数据拷贝到网卡中。此过程不需要将内核缓冲区中的数据拷贝到socket缓冲区中,这样减少了一次数据拷贝。

总结

        零拷贝技术相对于传统文件传输,减少了2次上下文切换、2次CPU拷贝,最终只用2次上下文切换和2次DMA拷贝,不经过CPU拷贝

扩展

内核缓冲区实际上是磁盘高速缓存(PageCache),通常刚被访问的数据段时间内再次被访问的概率很高,于是我们可以用PageCache来缓存最近被访问的数据,,当空间不足时淘汰最久未被访问的缓存,所以读磁盘数据的时候,优先在PageCache中找,如果有就返回,没有则从磁盘读取,然后缓存在PageCache中。PageCache也具备预读功能。

例:假设read方法每次读取32kb字节,虽然read刚开始只读0~32kb的字节,但是内核会将后面的32~64KB也读取到PageCache,这样读取后面32~64kb的时候,如果在32~64kb数据被淘汰出PageCache前,进程读取到它了,此时速度就很快。

        

       

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

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

相关文章

如何实现观察者模式和发布-订阅模式?

要实现观察者模式和发布-订阅模式,你需要遵循一些基本的步骤和原则。下面分别介绍这两种模式的实现方法。 如何实现观察者模式: 观察者模式(Observer Pattern)是一种行为设计模式,用于维护观察者(Observe…

GAT1399协议分析(8)--ImageInfo字段详解

一、官方定义 接上一章节字段消息返回内容 "ImageInfo": { "ImageID": "34078100001190001002012024060513561300065", "InfoKind": 0, "ImageSource": "…

eclipse怎么导入python项目

python项目导入eclipse的步骤: 1、首先,打开Eclipse集成开发程序,在菜单栏上点击“File(F)”,在弹出来的列表中点击“导入(I)...”。 2、在弹出来的“导入”窗口中,选择“常规”选项中的“现有…

【uni-app】开发问题汇总

文章目录 1、APP获取dom2、添加页面,参考其他页面,国际化就是对应页面的导航的国际化"navigationBarTitleText": "%m.i.ForgetPaymentPassword.bartitle%",3、setStatusBarStyle这个导航栏设置方法不要了,导航栏现在都用…

SpringCloud Gateway中Filters详细说明

前面 https://blog.csdn.net/J080624/article/details/139494909 我们研究了GateWay中各种路由断言的使用。SpringCloud GateWay 还提供了各种过滤器用来对请求和响应进行处理。 官网地址:SpringCloud Gateway Filter 【1】GatewayFilter Factories 路由过滤器允…

java使用websocket遇到的问题

java使用websocket的bug 1 websocket连接正常但是收不到服务端发出的消息java的websocket并发的时候导致连接断开(看着连接是正常的,但是实际上已经断开) 1 websocket连接正常但是收不到服务端发出的消息 java的websocket并发的时候导致连接断…

oracle中varchar和varchar2的区别

在Oracle数据库中,VARCHAR和VARCHAR2都是用于存储可变长度字符数据的数据类型,但它们之间有一些关键的区别。以下是这两者的主要区别: 数据类型来源: VARCHAR:这是标准SQL提供的类型,具有广泛的数据库系统…

一问看懂 llana2

"Illana2" 可能是指 "Llama 2",这是 Meta(Facebook 的母公司)推出的一个开源大型语言模型。Llama 2 是 LLaMA(Large Language Model Meta AI)的第二代版本,旨在用于各种自然语言处理任…

LeetCode|230. Kth Smallest Element in a BST

. 题目 Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree. Example 1: Input: root [3,1,4,null,2], k 1Output: 1 Example 2: Input: root [5,3,6,2,4,null,null,…

DVWA-CSRF

CSRF Low 观察后端代码,只要password_new等于password_conf就可以修改密码。由于这两个参数是通过GET传递的,所以直接构造payload。 http://192.168.20.156/DVWA/vulnerabilities/csrf/?password_newpass&password_confpass&ChangeChange# 这…

cad导入su线条不在一个平面怎么办?

解决CAD导入sketchup线条不是共面问题,需要考虑到各个步骤如下: 1)检查CAD文件。首先要检查CAD文件,确保线条是连接在一起的,并且看看有没有多余的线,以及是否有子线段没有合并,如果有会导致导入…

云南区块链商户平台发票助手成品

目录 1 概述2 功能对比3 项目演示图4 核心逻辑4.1智能赋码4.2 解密方法4.3 登录与检测4.4 发票金额大写转换4.5 检查登录是否失效4.6 验证码识别5 演示效果6 项目部署6.1 Web站点部署6.1.1 环境6.1.2 前端6.1.3 后端6.2 Docker部署6.2.1 构建镜像6.2.2 创建容器6.3.3 访问项目域…

情歌

题目描述 每次小明准备唱歌&#xff0c;他会选取两个数l和r&#xff08;l<r&#xff09;&#xff0c;他会将s中第l个字母~第r个字母拿出来。对于这个子串中的每个字母&#xff0c;他会重复吟唱k次&#xff0c;k为这个字母在字母表中的顺序。 例如&#xff0c;s’abbcb’&…

《Foundation CSS 参考手册》

《Foundation CSS 参考手册》 引言 Foundation 是一个强大的前端框架,它为开发者提供了一系列的CSS工具和组件,以便快速构建响应式、移动优先的网站。本参考手册旨在为那些希望深入了解和使用Foundation CSS的开发者提供一个全面的指南。 基础知识 1. 安装 Foundation 可…

unity中animation和animator在使用上的区别

Animation&#xff08;动画&#xff09;&#xff0c;可直接存储在物体上的animation组件中 Animation 组件用于在对象上直接存储和播放动画数据。这些数据通常是通过关键帧动画&#xff08;keyframe animation&#xff09;制作的&#xff0c;其中包含了对象在不同时间点的变换…

搜索与图论:八皇后问题

搜索与图论&#xff1a;八皇后问题 题目描述参考代码 题目描述 输入样例 4输出样例 .Q.. ...Q Q... ..Q...Q. Q... ...Q .Q..参考代码 #include <iostream>using namespace std;const int N 20;int n; char g[N][N]; bool col[N], dg[N], udg[N];void dfs(int u) {//…

WPF国际化的最佳实践

WPF国际化的最佳实践 1.创建项目资源文件 如果你的项目没有Properties文件夹和Resources.resx文件&#xff0c;可以通过右键项目-资源-常规-添加创建或打开程序集资源 2.添加国际化字符串 打开Resources.resx文件&#xff0c;添加需要翻译的文本字符&#xff0c;并将访问修…

充电桩产业链及商业模式

产业链概况 充电桩产业链分为上游元器件和设备生产商、建设商&#xff0c;中游为运营商&#xff0c;下游为各类充电场景。其中&#xff0c;上游零部件厂商提供充电模块&#xff08;IGBT、逆变器等&#xff09;、配电滤波设备、监控计费设备、充电枪等&#xff1b;中游充电桩厂…

.NET AI如何从0开始?

你是否在思考如何利用AI为您公司的产品增加智能方向的业务扩展&#xff1f; 或者你是否有思考过怎么去利用AI减少部分工作量&#xff1f; 如果你有类似于上面的问题&#xff0c;想要学习AI&#xff0c;并且您是一名.NET开发工程师&#xff0c;或您是一名弃暗投明的Java转.NET…

webpack和vite

一、前言 前端开发中&#xff0c;打包工具是不可或缺的工具之一。它们可以将分散的代码、样式和资源文件打包成更高效的形式&#xff0c;以提高性能、减少加载时间&#xff0c;并优化开发流程。 &#xff08;一&#xff09;、打包和打包工具 打包&#xff1a;将多个文件或模…