问题标签 [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.
java - 如何在客户端和服务器使用某些协议读取/写入文件的应用程序中实现零拷贝
通过使用 java,我必须通过添加标题信息来读取/写入文件。就像客户端想要写入一个文件一样,它首先会发送带有 DataOutputStream 的头信息(长度、文件信息...),然后是实际的文件内容。
应用程序级别不需要我的文件内容。这是否可以使用相同的套接字通道实现零复制,以便我可以传输文件的标头信息,然后传输文件内容。
在这种情况下,我该如何实现零拷贝。
c - Linux 有零拷贝吗?拼接还是发送文件?
当 splice 被引入时,内核列表中讨论了 sendfile 是基于 splice 重新实现的。splice SLICE_F_MOVE 的文档指出:
尝试移动页面而不是复制。这只是对内核的一个提示:如果内核无法从管道中移动页面,或者管道缓冲区没有引用完整页面,则仍然可以复制页面。这个标志的初始实现是错误的:因此从 Linux 2.6.21 开始,它是一个无操作(但仍然允许在 splice() 调用中);将来,可能会恢复正确的实施。
那么这是否意味着 Linux 没有用于写入套接字的零拷贝方法?或者这是在某个时候修复的,并且多年来没有人更新文档?sendfile 或 splice 在任何最新的 3.x 内核版本中是否具有零拷贝实现?
由于谷歌对此查询没有答案,我正在为下一个可怜的 schmuck 创建一个 stackoverflow 问题,他想知道使用 vmsplice 和 splice 或 sendfile 是否有任何好处而不是普通的旧写。
java - Channels.newChanne() 将有助于实现实际的 ZeroCopy
我对在 zeroCopy 操作中使用 Channels.newChannel(OutputStream/InputStream) 有一些疑问。它将作为 zeroCopy 吗?我有一些限制,比如必须发送第一个标题部分(文件和用户相关信息)然后是文件内容。为了测试,我也覆盖了 BufferedOutputStream,但在 fileChannel.transferTo 调用时,它正在调用我的覆盖方法......请帮助我如何在这种情况下实现 zeroCopy(标题+内容)。
部分测试代码:
routing - netfilter - 前路由零副本?
语境
Debian 64 位自定义内核 3.14-3.16
问题
在阅读了很多关于端口转发的内容之后,我想知道 nftable/iptables 是否使用拼接(或其他东西)进行零复制以将数据包路由到其目的地,以防数据包仅匹配预路由规则。
我的假设是“是的,当然,这些人肯定已经优化了系统中如此重要的工具”;但我仍然在问。
谢谢
java - 如何同时发送 FileRegion 和 ChannelBuffer 类型的数据包
我需要使用零拷贝(操作系统级别)在网络数据包的字段中发送数据。netty 在这两种数据传输中支持 FileRegion 和 ChannelBuffer。但是现在我想把这两种类型的数据一起组成一个数据包。
怎么解决 或者上面的代码编码器功能怎么写?
java - 为什么 CompositeByteBuf 不用于 ByteToMessageDecoder?
在 ReplayingDecoder 派生的 ByteToMessage 解码器 ( https://github.com/netty/netty/blob/master/codec/src/main/java/io/netty/handler/codec/ByteToMessageDecoder.java ) 中,累积 ByteBuf (用于累积数据,直到从网络中读取足够的数据以开始解码)似乎像动态数组一样实现。
我的意思是,如果当前累积 ByteBuf 具有保留传入数据的能力,则将其复制到累积 ByteBuf。如果容量不足,则扩展累积ByteBuf,将之前的累积ByteBuf和传入的数据都写入新分配的实例。有没有理由在这里不使用具有有限数量组件的 CompositeByteBuf?
使用 PooledByteBufAllocator 应该有助于减少内存分配的数量,但在我看来,将 CompositeByteBuf 与 PooledByteBufAllocator 结合使用仍然是最有效的解决方案,因为它会尝试优化内存分配和副本。
然而,在我为零复制聚合实现我自己的管道阶段的兔子洞之前,我想问一下当前实现是否有特定原因(例如,CompositeByteBuf 的构造是否由以下之一在后台执行复制调用,或者有人已经发现当前的策略在经验上更好?)
提前致谢
multithreading - 实现“移动”线程语义
我想写一个这样调用的函数:
其他一些正在做的线程
看到message
。
特别是,消息可能很大,所以我想要“移动”或“零复制”语义来发送消息。
在 C 中,解决方案类似于:
- 在堆上分配消息
- 有一个全局的、线程安全的哈希映射,将“地址”映射到某个内存位置
- 在发送时将指针写入内存位置,并使用信号量唤醒接收器
- 接收时从内存位置读取指针,并等待信号量处理新消息
但根据另一个 SO question,步骤 #2“听起来是个坏主意”。所以我希望看到一种更符合 Rust 习惯的方式来解决这个问题。
string - 如何从 D 中的字节数组构造字符串
我有定义为指针+大小的字节数组:
如何从中构造(最好是零拷贝)“字符串”?
java - 在远程站点之间移动文件 - 避免本地缓冲
我需要使用第三台主机(我的本地主机)中的 Java 应用程序移动两个文件(从远程主机 A 到远程主机 B)。
我想知道是否有机会将数据直接从主机 A 传输到主机 B,而无需将数据先前传输到我的本地主机缓冲区。这是因为远程站点之间的连接比从我的本地计算机到任何这些主机的连接要快得多。
如果我使用Java NIO通道传输数据,数据会直接从通道(主机)A传输到通道(主机)B吗?我不清楚这是可能的。
我知道这可以通过在任何远程站点中创建远程应用程序并从我的本地计算机发送 Web 服务或 RMI 请求来复制文件来完成,但我想避免这种情况。
也不可能在任何服务器中安装 FTP 服务器
谢谢