问题标签 [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 投票
3 回答
7111 浏览

c - 如何使用 Linux 的 splice() 函数将文件复制到另一个文件?

这是关于 splice() 的另一个问题。我希望用它来复制文件,并尝试使用通过管道连接的两个 splice 调用,例如 splice 的 Wikipedia 页面上的示例。我写了一个简单的测试用例,它只尝试从一个文件中读取前 32K 字节并将它们写入另一个文件:

当我运行它时,输入文件似乎被正确读取,但第二个拼接调用因 EINVAL 而失败。有人知道我在这里做错了什么吗?

谢谢!

0 投票
3 回答
340 浏览

terminology - 术语:与“零拷贝”相反?

我们正在对一些已转换为使用 sendfile() 的代码进行基准测试,该代码是 linux 零拷贝系统调用。sendfile() 取代的传统 read()/write() 循环的术语是什么?即,在我们的报告中,我想说“zerocopy 是 X 毫秒,而 ??? 是 Y 毫秒”。我应该使用什么词/短语?

0 投票
2 回答
2394 浏览

c - 哪些文件系统支持通过 Linux 的 splice(2) 进行拼接?

系统调用手册页splicesplice可能会失败并设置errnoEINVAL

目标文件系统不支持拼接;两个描述符都不指管道;或为不可搜索设备提供的偏移量

哪些文件系统支持拼接?

0 投票
2 回答
2230 浏览

c - 判断一个可读文件描述符是否是管道的读端

我想splice将数据从零复制STDIN_FILENO到文件描述符(可以是常规文件、字符或块设备、FIFO 或任何可以用open. 为了使用splicefrom文件描述符或to文件描述符必须是管道的适当末端,因此当程序员想要将数据从非管道零复制到非管道时,通常会创建一个管道作为中间缓冲区-管道。但是,如果STDIN_FILENO已经是管道的读取端,那么我可以跳过该步骤并尝试直接从STDIN_FILENO另一个文件描述符拼接。因此,我希望能够确定是否STDIN_FILENO是管道的读取端。

是否有Linux系统调用可以确定是否STDIN_FILENO是管道的读取端?

0 投票
4 回答
1728 浏览

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使用sendfilesendfile返回0是什么意思?

0 投票
0 回答
997 浏览

tcp - splice() 从管道到 TCP 缓冲?

来自 linuxquestions.org 的 xpost,对不起...

我写了一个小测试程序来看看一个简单的代理是否会从使用 splice() 中受益,但是我从管道拼接到 TCP 套接字的数据总是需要 200 毫秒才能从套接字的另一端读取。

这是测试它的 Perl 程序:

这是 strace 输出的示例:

注意 ~200ms read(9,...) 调用。如果我取消注释发送“\n”的行,那么没有延迟。我究竟做错了什么?谢谢!

0 投票
3 回答
6325 浏览

linux - 在共享内存结果零拷贝的进程之间进行通信?

我正在使用内核 2.6 在 Linux 上编写一个网络守护程序,它有 一个生产者进程和 N 个消费者进程,它不会对数据进行任何更改,也不会对生产者产生任何响应。

每当生产者进程产生一个数据对象时,其长度从几个 10 字节到几个 10 K 字节不等,它必须将数据对象传递给一个可用的消费者进程。

第一次,我考虑使用命名/未命名的 PIPE。但是,它们将是内存复制开销。

  1. 生产者的用户空间缓冲区 --copy--> 内核空间 PIPE 缓冲区
  2. 内核空间 PIPE 缓冲区 --copy--> 消费者的用户空间缓冲区

由于该程序可能与大量具有低延迟的对等点一起工作,因此复制开销可能是有害的。因此,我决定将 POSIX 共享内存与 mmap() 一起使用。

我只是想知道在使用POSIX 共享内存和 mmap() 的进程之间共享数据是否不会导致任何 memory-copy,这与 PIPE 不同。

另外,有没有其他方法可以在进程之间共享数据,但结果是零拷贝?该程序将在具有最新版本内核的 Linux 上运行,并且可能不需要具有跨平台能力。

由于设计问题,我决定不为每个消费者/产品生成/运行一个线程,而是一个进程。

谢谢您的回复。

0 投票
1 回答
3817 浏览

linux - vmsplice() 和 TCP

在最初的vmsplice()实现中,建议如果您的用户级缓冲区是管道中最大页数的 2 倍,则缓冲区后半部分的成功 vmsplice() 将保证内核已使用缓冲区的前半部分。

但这毕竟不是真的,特别是对于 TCP,内核页面会一直保留到从另一端收到 ACK 为止。解决这个问题留作未来的工作,因此对于 TCP,内核仍然必须从管道复制页面。

vmsplice()SPLICE_F_GIFT处理这个问题的选项,但问题是这暴露了另外两个问题——如何有效地从内核获取新页面,以及如何减少缓存垃圾。第一个问题是 mmap 需要内核清除页面,第二个问题是尽管 mmap 可能会使用内核中花哨的kscrubd功能,但这会增加进程的工作集(缓存垃圾)。

基于此,我有以下问题:

  • 通知用户空间安全重用页面的当前状态是什么?我对页面 splice()d 到套接字 (TCP) 上特别感兴趣。在过去的 5 年里发生了什么事情吗?
  • /// 是当前在 TCP 服务器mmap中进行零复制的最佳实践vmsplice,还是我们今天有更好的选择splicemunmap
0 投票
2 回答
2407 浏览

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 套接字是否热。

0 投票
1 回答
3255 浏览

windows - Windows 操作系统中是否存在零拷贝?

阅读这篇零拷贝文章

Windows 操作系统(服务器 2003、2008、2008 R2)中是否存在零拷贝?