使用 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
是建立在另一个之上的。为什么你认为他们是?
如何实际使用 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
是建立在另一个之上的。为什么你认为他们是?