如何实际使用kqueue()
进行简单的异步r / w?
它的开始似乎是epoll()
和select()
的替代,因此它试图解决的问题是扩展到监听大量文件描述符以进行更改。
但是,如果我想执行以下操作: 从描述符X读取数据,请告诉我数据何时准备就绪 - API如何支持?除非有一个免费的API用于启动非阻塞的r / w请求,否则我看不到除了自己管理线程池之外的其他方法,这会破坏目的。
这只是错误的工具吗?坚持aio
?
旁白:我不了解现代基于BSD的操作系统内部工作原理 - 但是kqueue()
建立在aio
上,反之亦然?我想这将取决于OS io子系统是否基本上是中断驱动或轮询。
答案 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
是建立在另一方上的。你为什么认为他们是?