使用 kqueue 进行简单的异步 io

Using kqueue for simple async io

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

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

但是,如果我想做类似的事情:从描述符 X 读取数据,当数据准备好时让我知道 - API 如何支持它?除非有免费的 API 用于启动非阻塞 r/w 请求,否则我除了自己管理线程池之外没有其他方法,这违背了目的。

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

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

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

None 你提到的 API,除了 aio 本身,与异步 IO 有任何关系,因此。

select()poll()epoll()kqueue()

None 有助于从文件系统(或 "vnodes")读取.文件系统项的文件描述符总是 "ready",即使文件系统是网络安装的并且存在网络延迟,以至于读取实际上会阻塞很长时间。避免阻塞的唯一选择是 aio 或者,在具有 GCD 的平台上,调度 IO。

kqueue() 等的使用用于其他类型的文件描述符,例如套接字、管道等,其中内核维护缓冲区并且有一些 "event"(例如到达数据包或写入管道)在数据可用时发生变化。当然,kqueue()也可以监控其他各种输入源,比如Mach端口、进程等

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

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