Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中是否有sendfile的异步版本?_Linux_Sockets_Asynchronous_Sendfile_Aio - Fatal编程技术网

Linux中是否有sendfile的异步版本?

Linux中是否有sendfile的异步版本?,linux,sockets,asynchronous,sendfile,aio,Linux,Sockets,Asynchronous,Sendfile,Aio,第一眼看上去,io_getevents通知机制功能非常强大,因此我希望能够使用它。我只是找不到任何东西。在Windows上,这很简单:只有传输文件,可以异步(重叠)工作,如果需要,还可以使用某种通知机制(IOCP、事件)。Linux上一定有类似的东西,对吧?或者,把我的问题放到某个上下文中,我如何在Linux上创建一个高效的文件服务器?唉,在Linux上没有什么容易的事情,几乎任何东西都可能在错误的情况下阻塞()。在回答您的问题时(在标题和正文中): (2019)Linux中没有系统提供的se

第一眼看上去,
io_getevents
通知机制功能非常强大,因此我希望能够使用它。我只是找不到任何东西。在Windows上,这很简单:只有
传输文件
,可以异步(重叠)工作,如果需要,还可以使用某种通知机制(IOCP、事件)。Linux上一定有类似的东西,对吧?或者,把我的问题放到某个上下文中,我如何在Linux上创建一个高效的文件服务器?

唉,在Linux上没有什么容易的事情,几乎任何东西都可能在错误的情况下阻塞()。在回答您的问题时(在标题和正文中):

  • (2019)Linux中没有系统提供的
    sendfile
    异步版本(Linux不是Windows或FreeBSD)。有一篇精彩的报道。这需要注意,但它很复杂,并且使用线程
  • 与Windows相比,在Linux上创建高效的文件服务器需要不同的思维方式。请看一看或了解其中涉及的权衡
他们的休息

未来(2020+解决方案
有人建议,未来的一些Linux内核(5.5之后,在撰写本文时已经达到了5.5-rc7)基本上可以执行…

唉,在Linux上没有什么容易的,几乎任何东西都可能在错误的情况下阻塞()。在回答您的问题时(在标题和正文中):

  • (2019)Linux中没有系统提供的
    sendfile
    异步版本(Linux不是Windows或FreeBSD)。有一篇精彩的报道。这需要注意,但它很复杂,并且使用线程
  • 与Windows相比,在Linux上创建高效的文件服务器需要不同的思维方式。请看一看或了解其中涉及的权衡
他们的休息

未来(2020+解决方案
有人建议,如果套接字是非阻塞的,未来的一些Linux内核(5.5之后的内核“在编写本文时已经达到5.5-rc7”),基本上可以执行…

,而不是
sendfile
(它将报告计划在套接字的“缓冲区”中发送的数据量)。您需要轮询套接字以查看何时可以继续执行
sendfile
操作(请参阅
epoll
)。。。或者更好的方法是,使用一个库来为您实现这一点。@Myst Mh,当我想到异步I/O时,我想到的是可以在任意时间点启动并在完成时收到通知的操作。使用epoll+sendfile,我首先必须等待发送缓冲区可用,调用sendfile,它会将一些数据复制到所述缓冲区(同步!),冲洗并重复。此外,我还了解到sendfile即使与非阻塞套接字一起使用,也可能阻塞,使用
readahead
:这会引入更复杂的应用程序设计和更大的延迟,因为在实际工作之前需要大量的上下文切换。我真的觉得整个“非阻塞”方法并不令人满意。
sendfile
确实不是
asio
,但它不会将数据同步复制到套接字的缓冲区(这就是为什么将套接字设置为非阻塞很重要的原因)。。。实际上,它甚至不复制数据(这是它优化的一部分)。据我所知,数据是直接从文件缓冲区打包的。@Myst没问题,但是sendfile文档有很大的误导性。它清楚地说“如果传输成功,写入out_fd的字节数将返回。”此外,非阻塞发送/接收必须同步复制,没有其他方法。但这不是重点。例如,我希望同时执行多个发送操作。我认为使用非阻塞套接字+epoll是不可能的,对吗?使用实际的异步I/O,我可以将一些头和实际的文件数据一起排队。操作系统可以在及时预取文件数据的同时开始发送我的标题。如果套接字是非阻塞的,则
sendfile
(它将报告计划在套接字的“缓冲区”中发送的数据量)。您需要轮询套接字以查看何时可以继续执行
sendfile
操作(请参阅
epoll
)。。。或者更好的方法是,使用一个库来为您实现这一点。@Myst Mh,当我想到异步I/O时,我想到的是可以在任意时间点启动并在完成时收到通知的操作。使用epoll+sendfile,我首先必须等待发送缓冲区可用,调用sendfile,它会将一些数据复制到所述缓冲区(同步!),冲洗并重复。此外,我还了解到sendfile即使与非阻塞套接字一起使用,也可能阻塞,使用
readahead
:这会引入更复杂的应用程序设计和更大的延迟,因为在实际工作之前需要大量的上下文切换。我真的觉得整个“非阻塞”方法并不令人满意。
sendfile
确实不是
asio
,但它不会将数据同步复制到套接字的缓冲区(这就是为什么将套接字设置为非阻塞很重要的原因)。。。实际上,它甚至不复制数据(这是它优化的一部分)。据我所知,数据是直接从文件缓冲区打包的。@Myst没问题,但是sendfile文档有很大的误导性。它清楚地说“如果传输成功,写入out_fd的字节数将返回。”此外,非阻塞发送/接收必须同步复制,没有其他方法。但这不是重点。例如,我希望同时执行多个发送操作。我认为使用非阻塞套接字+epoll是不可能的,对吗?使用实际的异步I/O,我可以将一些头和实际的文件数据一起排队。操作系统可以开始发送我的h