问题标签 [zero-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1414 浏览

c++ - Visual Studio 2010 中的传输文件功能

我写了一个函数TransmitFile APIrecv函数中使用,程序如下:

但我收到如下错误:

是因为库链接失败还是其他原因?是否有任何 API 可以从客户端套接字接收数据到文件并且它也实现零复制方法?

0 投票
1 回答
1161 浏览

c++ - 零拷贝接收功能

我正在尝试实现零复制机制,即与TransmitFile()API 相反的功能。

但我不知道如何在内核中注册缓冲区。以下是我想要实现零拷贝的详细信息:

  1. 我们将在客户端缓冲区中收到来自服务器的大量数据,我在这里也怀疑天气数据将进入套接字缓冲区(客户端)还是首先进入 NIC 缓冲区,请也清除这个疑问。

  2. 现在,我想从套接字缓冲区将数据直接复制到内核缓冲区,然后复制到磁盘中,而不进行读写系统调用,即不切换上下文。

  3. 数据只能直接移动到内核空间内的内核缓冲区。

是否有任何 API 或某种方法可以实现这一目标?还有其他建议吗?

套接字位于 TCP/IP 连接上。

0 投票
1 回答
2580 浏览

string - 将字符串分配给 zmq::message_t 而不复制

我需要做一些高性能的 c++ 东西,这就是为什么我需要尽可能避免复制数据。

因此,我想直接将字符串缓冲区分配给 zmq::message_t 对象而不复制它。但似乎有一些避免成功发送的字符串释放。

这是一段代码:

如何避免在发送消息之前释放字符串?字符串何时被准确释放?

问候

0 投票
4 回答
29833 浏览

linux - “零拷贝网络”与“内核绕过”?

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

0 投票
1 回答
239 浏览

c++ - 使用 Intel I/OAT 时,在虚拟寻址中,设备内存映射到哪里?

当我使用Intel I/OAT通过async_memcpy进行 DMA 零复制/零周期(无 CPU)传输时,在虚拟寻址中,设备内存映射到哪里:到内核缓冲区(内核空间)或用户-缓冲区(用户空间)?

在现代 x86_64 CPU 中使用 I/OAT 是否有意义(当 CPU 内核可以在没有芯片组北桥的情况下快速访问 RAM)?

http://www.intel.com/content/www/us/en/wireless-network/accel-technology.html

0 投票
1 回答
1810 浏览

memory - OpenCL(如CUDA)中是否有主机内存的设备端指针供内核使用?

在CUDA中,我们可以通过主机内存的设备端指针来实现从主机内存到设备共享内存的内核管理数据传输。像这样:

在上面的例子中,内核代码可以通过dev_a,dev_b和访问主机内存dev_c。内核可以利用这些指针直接将数据从主机移动到共享内存,而无需通过全局内存中继它们。

但似乎这在 OpenCL 中是不可能完成的任务?(OpenCL 中的本地内存相当于 CUDA 中的共享内存)

0 投票
3 回答
4173 浏览

linux - Netty 的零拷贝和操作系统级别的零拷贝有区别吗?

我发现 Netty文档说他们的内置文件中有“透明零拷贝”功能ByteBuffer。但是在阅读之后,我注意到它没有提到任何内核空间和用户空间切换,只是关于重用缓冲区。

所以我想知道 Netty 的“零复制”功能是否不同于操作系统级别的“零复制”(这意味着减少从用户空间内存到内核空间内存的复制)?

0 投票
1 回答
2788 浏览

java - 使用 Java 在两个或多个套接字之间执行零拷贝数据传输

有谁知道在两个或多个套接字之间执行零复制数据传输的任何好的 java 库/API 包?我知道 Java 的 NIO API 可以分别使用 java.nio.channels.FileChannel.transferTo 和 java.nio.channels.FileChannel.transferFrom 方法执行从磁盘到套接字的零复制数据传输,反之亦然。但是,似乎不支持 java 套接字到套接字的零拷贝传输。此外,任何可以执行系统调用拼接(可以将数据从文件描述符传输到管道,反之亦然)的 java 库/API 将是一个加号,最好是在 linux 平台上。

感谢您的回复。

此外,我阅读了大部分关于零拷贝的先前博客以及其他信息丰富的站点,例如http://www.ibm.com/developerworks/library/j-zerocopy/;但是,上述问题似乎没有得到解决。

0 投票
0 回答
212 浏览

linux-kernel - 使用 mmap 的奇怪行为

我正在使用基于 Technexion 发行版的 Angtsrom 嵌入式 linux 内核 v.2.6.37。DM3730 SoC、TDM3730 模块、定制基板。CodeSourcery 工具链 v. 2010-09.50

这是我系统中的数据流:http: //i.stack.imgur.com/kPhKw.png

FPGA 生成递增数据,内核通过 GPMC DMA 读取它。GPMC 包大小 = 512 个数据样本。缓冲区大小 = 61440 个 32 位样本(=60 个内存页)。

DMA 缓冲区由 dma_alloc_coherent 分配并通过 mmap() 调用映射到用户空间。用户应用程序直接从 DMA 缓冲区读取数据并使用 fwrite() 调用保存到 NAND。用户一次读取 4096 个样本数据。

我在文件中看到了什么?http://i.stack.imgur.com/etzo0.png 红线表示环形缓冲区的第一个边界。哎呀!小包(约 16 个样本)在边框后开始隐藏。它们的值是准确的 = 相应缓冲区位置的“旧”值。但为什么?16 个样本远小于 DMA 包大小和用户读取包大小,因此不会出现指针不匹配。

我想有一些 mmap() 功能隐藏在某处。我为 mmap() 尝试了不同的标志 - 例如 MAP_LOCKED、MAP_POPULATE、MAP_NONBLOCK,但没有成功。我完全误解了这种行为:(

PS 当我从内核使用 copy_to_user() 而不是 mmap() 和零拷贝访问时,没有这样的行为。

0 投票
1 回答
8456 浏览

linux - 为什么 Linux 内核中没有零拷贝网络?

我想知道为什么 linux 内核(或任何其他主流操作系统)没有零拷贝网络功能的原因?零拷贝是指数据包/数据流不会被拷贝以传递给用户空间中的应用程序,而是使用内存池类型的分配器在内核和用户空间之间共享内存。我自己提出了3个理论:

a) 我想存在安全问题。但是,当它们仅用作缓冲区时,真的没有办法在用户空间和内核之间安全地共享内存吗?

b)我想存在稳定性问题。但是我们不能假设任何使用零拷贝网络并且需要实例化和传递内核调用的内存池的人都知道内存管理吗?足够了解以避免泄漏?

c)到目前为止还没有完成/不需要。我真的无法想象没有人要求这个功能,因为每个使用小数据包大小的人通常都会受到“慢” TCP 堆栈实现的瓶颈,并且有 3rd 方工具提供用于 0-copy 网络的特殊用途网卡。

随意发布任何猜测,但请标记您是否假设或更深入地了解保持 StackOverflow 质量的原因:-)