首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对简单异步io使用kqueue

对简单异步io使用kqueue
EN

Stack Overflow用户
提问于 2016-02-06 01:28:22
回答 2查看 1.4K关注 0票数 0

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

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

但是,如果我想做这样的事情:从描述符X读取数据,请告诉我数据何时准备好了--是如何支持的?除非有一个免费的API来启动非阻塞的r/w请求,否则除了自己管理线程池之外,我看不出有什么其他方法,这违背了这个目的。

这仅仅是做这项工作的错误工具吗?坚持使用aio

撇开不说:,我不知道基于BSD的操作系统内部是如何工作的--但是kqueue()是建立在aio的基础上的,还是visa的呢?我可以想象,这将取决于OS子系统是从根本上讲是中断驱动的还是轮询的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-06 07:07:58

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

select()poll()epoll()kqueue()都无助于从文件系统(或“vnode”)中读取数据。文件系统项的文件描述符总是“准备好”的,即使文件系统是网络挂载的,并且存在网络延迟,以至于读取实际上会阻塞相当长的时间。您在那里避免阻塞的唯一选择是aio,或者在GCD平台上调度IO。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-02-06 02:27:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35236247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档