如何实际使用kqueue()进行简单的异步r/w?
它的开始似乎是作为epoll()和select()的替代品,因此它试图解决的问题是扩展到侦听大量的文件描述符进行更改。
但是,如果我想做这样的事情:从描述符X读取数据,请告诉我数据何时准备好了--是如何支持的?除非有一个免费的API来启动非阻塞的r/w请求,否则除了自己管理线程池之外,我看不出有什么其他方法,这违背了这个目的。
这仅仅是做这项工作的错误工具吗?坚持使用aio
撇开不说:,我不知道基于BSD的操作系统内部是如何工作的--但是kqueue()是建立在aio的基础上的,还是visa的呢?我可以想象,这将取决于OS子系统是从根本上讲是中断驱动的还是轮询的。
发布于 2016-02-06 07:07:58
除了aio本身之外,您提到的所有API都与异步IO没有任何关系。
select()、poll()、epoll()或kqueue()都无助于从文件系统(或“vnode”)中读取数据。文件系统项的文件描述符总是“准备好”的,即使文件系统是网络挂载的,并且存在网络延迟,以至于读取实际上会阻塞相当长的时间。您在那里避免阻塞的唯一选择是aio,或者在GCD平台上调度IO。
kqueue()等用于其他类型的文件描述符,如套接字、管道等,其中内核维护缓冲区,并且有一些“事件”(例如数据包的到达或对管道的写入)在数据可用时发生更改。当然,kqueue()还可以监视其他各种输入源,如Mach端口、进程等。
(您可以使用kqueue()读取vnodes,但它只会告诉您文件位置不在文件末尾时。因此,您可以使用它在文件被扩展或截断时得到通知。这并不意味着读取不会阻塞。)
我不认为kqueue()或aio都是建立在另一个基础上的。你为什么会认为他们是?
发布于 2016-02-06 02:27:18
我使用kqueues将Linux代理服务器(基于epoll)调整为BSD。我设置了单独的GCD异步队列,每个队列使用一个kqueue来侦听一组套接字。GCD为您管理线程。
https://stackoverflow.com/questions/35236247
复制相似问题