【发布时间】:2018-06-10 12:39:00
【问题描述】:
io_getevents 通知机制乍一看似乎很强大,所以我想要一些可以与它一起使用的东西。我只是还找不到任何东西。在 Windows 上,这很简单:只有TransmitFile,如果你想要的话,它可以异步工作(重叠)和一些通知机制(IOCP、事件)。 Linux 上必须有一些等价物,对吧?或者,将我的问题放在某种背景下,我将如何在 Linux 上创建高效的文件服务器?
【问题讨论】:
-
如果套接字是非阻塞的,
sendfile也不会(它将报告计划在套接字的“缓冲区”中发送多少数据)。您将需要轮询套接字以查看何时可以继续sendfile操作(请参阅epoll)...或者更好的是,使用为您执行此操作的库。 -
@Myst Mh,当我想到异步 I/O 时,我想到了可以在任意时间点开始并在完成时收到通知的操作。使用 epoll+sendfile,我首先必须等到发送缓冲区可用,调用 sendfile 它将一些数据复制到所述缓冲区(同步!),冲洗并重复。
-
另外,我读到 sendfile 可能会在与非阻塞套接字一起使用时阻塞,并且可以使用
readahead解决这个问题:brad.livejournal.com/2228488.html 这引入了更复杂的应用程序设计和更多延迟因为在实际工作之前需要大量的上下文切换。我真的不觉得整个“非阻塞”方法令人满意。 -
sendfile确实不是asio,但它确实不将数据同步复制到套接字的缓冲区(这就是为什么将套接字设置为非阻塞)...实际上,它甚至不复制数据(这是优化的一部分)。据我记得,数据是直接从文件缓冲区打包出来的。 -
@Myst 好的,但是 sendfile 文档非常具有误导性。它明确表示“如果传输成功,则返回写入 out_fd 的字节数。”此外,非阻塞发送/接收 必须 同步复制,没有其他办法。但这不是重点。例如,我想一次在飞行中进行多个发送操作。我认为使用非阻塞套接字+epoll 是不可能的,对吧?使用实际的异步 I/O,我可以将一些标头排队,然后是实际的文件数据。操作系统可以在及时预取文件数据的同时开始发送我的标头。
标签: linux sockets asynchronous sendfile aio