使用kqueue进行简单的异步io

时间:2016-02-06 01:28:23

标签: ios macos asynchronous bsd

如何实际使用kqueue()进行简单的异步r / w?

它的开始似乎是epoll()select()的替代,因此它试图解决的问题是扩展到监听大量文件描述符以进行更改。

但是,如果我想执行以下操作: 从描述符X读取数据,请告诉我数据何时准备就绪 - API如何支持?除非有一个免费的API用于启动非阻塞的r / w请求,否则我看不到除了自己管理线程池之外的其他方法,这会破坏目的。

这只是错误的工具吗?坚持aio

旁白:我不了解现代基于BSD的操作系统内部工作原理 - 但是kqueue()建立在aio上,反之亦然?我想这将取决于OS io子系统是否基本上是中断驱动或轮询。

2 个答案:

答案 0 :(得分:0)

我使用kqueues使Linux代理服务器(基于epoll)适应BSD。我设置了单独的GCD异步队列,每个队列使用一个kqueue来侦听一组套接字。 GCD为您管理线程。

答案 1 :(得分:0)

除了aio本身之外,你提到的所有API都没有与异步IO有关。

select()poll()epoll()kqueue()都无法从文件系统(或“vnodes”)中读取。文件系统项的文件描述符总是“就绪”,即使文件系统是网络安装的,并且存在网络延迟,使得读取实际上会阻塞很长时间。您唯一可以避免阻止的选择是aio,或者在具有GCD的平台上调度IO。

kqueue()之类的使用是针对其他类型的文件描述符,例如套接字,管道等,其中内核维护缓冲区并且存在一些“事件”(如数据包的到达或写入)在数据可用时更改的管道)。当然,kqueue()还可以监视各种其他输入源,如Mach端口,进程等。

(您可以使用kqueue()来读取vnodes,但它只会告诉您文件位置何时不在文件的末尾。因此,您可以使用它来获取文件的时间扩展或截断。这并不意味着读取不会阻塞。)

我不认为kqueue()aio是建立在另一方上的。你为什么认为他们是?