“零复制网络”与“内核绕过”?

2024-01-08

“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同还是不同?内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?


“零拷贝网络”和“内核绕过”有什么区别?这两个短语的意思是相同还是不同?内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?

TL;DR - 它们是不同的概念,但内核旁路 API/框架内很可能支持零复制。


用户绕过

这种沟通方式也应该被考虑。也许有可能DMA 到 DMA完全不涉及CPU的事务。这个想法是使用splice()或类似的函数来避免用户空间根本不。请注意,与splice(),整个数据流不需要绕过用户空间。标头可以在用户空间中读取,数据可以直接流式传输到磁盘。最常见的缺点是splice()不进行校验和卸载。

零拷贝

The 零拷贝概念只是网络缓冲区固定在适当的位置并且不会移动。在许多情况下,这并不是真正有益的。最现代的网络硬件支持分散聚集 http://en.wikipedia.org/wiki/Vectored_I/O, 也叫作缓冲区描述符等等。这个想法是网络硬件理解物理指针。缓冲区描述符通常包括:

  1. 数据指针
  2. Length
  3. Next 缓冲区描述符

好处是网络标头不需要存在并排 and IP, TCP, and 应用标头可以在物理上与应用数据.

如果控制器不支持此功能,则TCP/IP标头必须位于用户数据以便可以在发送到之前填写它们网络控制器.

零拷贝还意味着一些内核用户 MMU 设置,以便共享页面。

内核绕过

当然,你可以绕过内核。这是什么pcap http://en.wikipedia.org/wiki/Pcap和其他嗅探软件已经做了一段时间了。然而,pcap并不会阻止正常的内核处理;但这个概念类似于内核旁路框架所允许的。即,直接将数据包传送到将发生处理标头的用户空间。

然而,很难看到这样的案例:用户空间除非与特定硬件绑定,否则将有明确的胜利。一些网络控制器可能有分散聚集控制器支持,其他控制器可能不支持。

有多种内核接口可以实现内核旁路。困难在于接收到的数据和生成用于传输的数据会发生什么情况。通常这涉及其他设备,因此有很多解决方案。


为了把这个放在一起...

这两个短语的意思是相同还是不同?

正如上面希望解释的那样,它们是不同的。

内核绕过是“零复制网络”中使用的技术吗?这就是关系吗?

事实恰恰相反。内核绕过可以使用零拷贝并且很可能会支持它,因为缓冲区完全在应用程序的控制之下。此外,内核和用户空间之间没有内存共享(意味着不需要 MMU 共享页面以及可能导致的任何缓存/TLB 影响)。所以如果你正在使用内核绕过,支持通常是有利的零拷贝;所以一开始事情可能看起来是一样的。

如果分散-聚集 DMA 可用(大多数现代控制器),用户空间或内核都可以使用它。零拷贝在这种情况下没有那么有用。

参考:

  • OnLoad 技术参考 http://www.solarflare.com/Content/UserFiles/Documents/Solarflare_OpenOnload_IntroPaper.pdf,一个高带宽内核旁路系统。
  • PF Ring http://www.ntop.org/products/pf_ring/自 2.6.32 起(如果已配置)
  • Linux内核网络缓冲区管理 http://vger.kernel.org/%7Edavem/skb_data.html大卫·米勒着。这给出了如何在内核中管理协议头/尾的想法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“零复制网络”与“内核绕过”? 的相关文章

  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 在请求中设置端口

    我正在尝试利用cgminer使用 Python 的 API 我对利用requests图书馆 我了解如何做基本的事情requests but cgminer想要更具体一点 我想缩小 import socket import json sock
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 如何重新校准 Qt 应用程序的触摸事件?

    我有一个简单的 Qt5 2 应用程序 它是为 TI AM335x EVM 基于 ARM 的处理器 构建的 它只有 1 个按钮 可启用板上的一些 LED 我遇到的问题是触摸事件未针对屏幕进行校准 例子 X 所以如果 是按钮所在的位置 X是您必
  • 每当按下光标或箭头键时,如何获取当前光标位置(在文本区域中)?

    我试图单击一下后立即获取文本光标的位置down鼠标重新定位它 问题是selectionStart and selectionEnd不返回光标的最新位置 因为在单击之前不会存储 新 位置released 当您尝试使用鼠标重新定位插入符号时 代
  • 如何使用 Gradle Kotlin 脚本创建 fat JAR?

    如题 我想知道如何修改gradle build kts为了有一个任务来创建一个独特的jar包含所有依赖项 包括 kotlin lib 我在 Groovy 中找到了这个示例 create a single Jar with all depen
  • mingw-4.8.1 原子问题

    当我尝试使用原子的 is lock free 方法时 出现以下编译错误 struct Simple1 int i struct Simple2 int a int b struct Simple3 int a int b int c int
  • Prestashop:../../../classes/Configuration.php 中内存不足(已分配...)

    Prestashop 突然给出了一个http 500 错误 我打开错误日志并得到以下信息 致命错误 内存不足 已分配 709623808 尝试分配 130968 字节 中 var www vhosts 44 252639 webspace
  • ActiveRecord::NoEnvironmentInSchemaError

    我正在尝试在新升级的应用程序 Rails 5 上执行与数据库相关的操作 但无法在本地执行破坏性数据库命令 rails db reset or rails db drop 跟踪结果如下数据 rails db drop trace Invoke
  • ruby-debug 安装错误:无法构建 gem 本机扩展

    我正在使用 Rails 3 运行 1 9 2 我正在使用rvm I did sudo gem install ruby gem and got Building native extensions This could take a whi
  • 如何根据滚动百分比移动 div

    我正在尝试为我的应用程序制作一些动画 但我无法弄清楚 我希望文本和描述根据页面滚动的程度而移动 对于第一个 div 我成功做到了 但对于其他 div 什么也没有发生 当我滚动超过 40 来根据滚动移动 div 时 我该怎么做 这是我的代码
  • Freebase 查询 - 排除某些值

    我想检索所有电影的名称及其类型 如果有关流派的信息为空也没关系 但如果流派已知 我想检索它 film film genre id null optional optional 但我对同性恋色情不感兴趣 所以我想排除所有类型为 en gay
  • startManagingCursor(cursor) 已弃用的方法

    我使用了这段代码 Cursor c cr query message null null null null startManagingCursor c But startManagingCursor c 是一个已弃用的方法 我怎样才能更换
  • C++ 枚举的基础类型是什么?

    这可能已经在其他地方得到了回答 但我找不到合适的答案 我有这个代码 enum enumWizardPage WP NONE 0x00 WP CMDID 0x01 WP LEAGUES 0x02 WP TEAMS 0x04 WP COMP 0
  • Delphi 服务应用程序随机崩溃

    我有一个德尔福服务应用程序 Indy TCP 服务器和许多客户端 最多 50 个 到 Firebird 的 ADO 连接和简单的网络交换 应用程序在下一个事件 例如 中随机崩溃 可能在 7 天后工作 可能是 1 小时 文件 rollcont
  • CSS 重叠箭头

    我正在尝试仅使用 CSS3 来完成与下图非常非常相似的事情 唯一的区别是最后一个 div 有一个尖头 在我寻找类似适应的东西时 我遇到了这个 js 小提琴 http jsfiddle net amkrtchyan eju9r 14 这非常接
  • GuestAdditions 版本不匹配

    当我使用这个命令时 vagrant up 我收到此错误 machine1 GuestAdditions versions on your host 4 3 36 and guest 5 0 10 do not match 如何从 ubunt
  • Kotlin 中线程和协程的区别

    Kotlin 中是否存在与其他语言的协程实现不同的特定语言实现 协程就像轻量级线程是什么意思 有什么不同 Kotlin 协程实际上是并行 并发 运行的吗 即使在多核系统中 在任何给定时间都只有一个协程在运行吗 这里我启动了 100 000
  • 如何通过南迁在现有模型中添加一对一的关系字段

    我已经有模型了 class ModelA models Model name models CharField max length 255 blank False 我里面有很多条目 现在我想在其中添加一个字段 即 user models
  • 修改R包数据

    bio infer 包包含需要修改的数据框 usr lib R library bio infer data itis ttable rda 加载 bio infer 包并附加数据框后 data 函数 我使用 write table 将数据
  • swift 3 准备(for segue: )功能损坏? [复制]

    这个问题在这里已经有答案了 由于某些奇怪的原因 对于 swift 3 prepare for segue 方法拒绝确认 segue 标识符 我将以下 IBAction 连接到 UI 上的几个按钮 IBAction func goToImag
  • 如何在 Spring Boot 中创建单个可执行战争

    我们正在使用 Spring Boot 开发 Spring Cloud 项目 我们的目标是创建一个可以使用 java jar 运行的可执行 war 我关注了 SO 上的几篇文章 并能够通过 1 在 2 在 spring boot maven
  • “零复制网络”与“内核绕过”?

    零拷贝网络 和 内核绕过 有什么区别 这两个短语的意思是相同还是不同 内核绕过是 零复制网络 中使用的技术吗 这就是关系吗 零拷贝网络 和 内核绕过 有什么区别 这两个短语的意思是相同还是不同 内核绕过是 零复制网络 中使用的技术吗 这就是