问题标签 [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.
c - 如何使用 Linux 的 splice() 函数将文件复制到另一个文件?
这是关于 splice() 的另一个问题。我希望用它来复制文件,并尝试使用通过管道连接的两个 splice 调用,例如 splice 的 Wikipedia 页面上的示例。我写了一个简单的测试用例,它只尝试从一个文件中读取前 32K 字节并将它们写入另一个文件:
当我运行它时,输入文件似乎被正确读取,但第二个拼接调用因 EINVAL 而失败。有人知道我在这里做错了什么吗?
谢谢!
terminology - 术语:与“零拷贝”相反?
我们正在对一些已转换为使用 sendfile() 的代码进行基准测试,该代码是 linux 零拷贝系统调用。sendfile() 取代的传统 read()/write() 循环的术语是什么?即,在我们的报告中,我想说“zerocopy 是 X 毫秒,而 ??? 是 Y 毫秒”。我应该使用什么词/短语?
c - 使用 sendfile(),是否可以判断 in_fd 何时处于 EOF?
阅读Linux 系统调用的手册页sendfile
,我想知道调用程序是否有可能知道何时in_fd
处于 EOF。据推测,这可以通过返回值 0 来表示,但这会导致返回值 0 的实际含义的问题。如果sendfile
是 like write
,则返回值 0 仅表示复制了 0 个字节。但是,如果sendfile
是 like read
,那么返回值 0 将意味着 EOF。必须事先知道要复制多少字节in_fd
才能out_fd
使用sendfile
?sendfile
返回0是什么意思?
tcp - splice() 从管道到 TCP 缓冲?
来自 linuxquestions.org 的 xpost,对不起...
我写了一个小测试程序来看看一个简单的代理是否会从使用 splice() 中受益,但是我从管道拼接到 TCP 套接字的数据总是需要 200 毫秒才能从套接字的另一端读取。
这是测试它的 Perl 程序:
这是 strace 输出的示例:
注意 ~200ms read(9,...) 调用。如果我取消注释发送“\n”的行,那么没有延迟。我究竟做错了什么?谢谢!
linux - 在共享内存结果零拷贝的进程之间进行通信?
我正在使用内核 2.6 在 Linux 上编写一个网络守护程序,它有 一个生产者进程和 N 个消费者进程,它不会对数据进行任何更改,也不会对生产者产生任何响应。
每当生产者进程产生一个数据对象时,其长度从几个 10 字节到几个 10 K 字节不等,它必须将数据对象传递给一个可用的消费者进程。
第一次,我考虑使用命名/未命名的 PIPE。但是,它们将是内存复制开销。
- 生产者的用户空间缓冲区 --copy--> 内核空间 PIPE 缓冲区
- 内核空间 PIPE 缓冲区 --copy--> 消费者的用户空间缓冲区
由于该程序可能与大量具有低延迟的对等点一起工作,因此复制开销可能是有害的。因此,我决定将 POSIX 共享内存与 mmap() 一起使用。
我只是想知道在使用POSIX 共享内存和 mmap() 的进程之间共享数据是否不会导致任何 memory-copy,这与 PIPE 不同。
另外,有没有其他方法可以在进程之间共享数据,但结果是零拷贝?该程序将在具有最新版本内核的 Linux 上运行,并且可能不需要具有跨平台能力。
由于设计问题,我决定不为每个消费者/产品生成/运行一个线程,而是一个进程。
谢谢您的回复。
linux - vmsplice() 和 TCP
在最初的vmsplice()
实现中,建议如果您的用户级缓冲区是管道中最大页数的 2 倍,则缓冲区后半部分的成功 vmsplice() 将保证内核已使用缓冲区的前半部分。
但这毕竟不是真的,特别是对于 TCP,内核页面会一直保留到从另一端收到 ACK 为止。解决这个问题留作未来的工作,因此对于 TCP,内核仍然必须从管道复制页面。
vmsplice()
有SPLICE_F_GIFT
处理这个问题的选项,但问题是这暴露了另外两个问题——如何有效地从内核获取新页面,以及如何减少缓存垃圾。第一个问题是 mmap 需要内核清除页面,第二个问题是尽管 mmap 可能会使用内核中花哨的kscrubd功能,但这会增加进程的工作集(缓存垃圾)。
基于此,我有以下问题:
- 通知用户空间安全重用页面的当前状态是什么?我对页面 splice()d 到套接字 (TCP) 上特别感兴趣。在过去的 5 年里发生了什么事情吗?
- /// 是当前在 TCP 服务器
mmap
中进行零复制的最佳实践vmsplice
,还是我们今天有更好的选择splice
?munmap
udp - Linux splice() 返回 EINVAL(“无效参数”)
我正在尝试使用 splice ( man 2 splice ) 将数据从 UDP 套接字直接复制到文件中。不幸的是,第一次调用 splice() 返回 EINVAL。
手册页指出:
但是,我相信这些条件都不适用。我正在使用 Fedora 15(内核 2.6.40-4),所以我相信所有文件系统都支持 splice()。目标文件在第一次调用 splice 时应该是无关紧要的,但为了完整起见,我将通过open(path, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR)
. 两个调用都使用管道,并且两个调用都没有使用除 NULL 之外的偏移量。
这是我的示例代码:
sock_fd 由以下伪代码初始化:
可能相关的是此代码片段在 libevent 循环中运行。libevent 使用 epoll() 来确定 UDP 套接字是否热。
windows - Windows 操作系统中是否存在零拷贝?
阅读这篇零拷贝文章,
Windows 操作系统(服务器 2003、2008、2008 R2)中是否存在零拷贝?