使用 kqueue 在 FreeBSD 上开发高性能应用服务器
2010-05-21 00:00:00 来源:WEB开发网概述
kqueue 是 FreeBSD 上的一种的多路复用机制。它是针对传统的 select/poll 处理大量的文件描述符性能较低效而开发出来的。注册一批描述符到 kqueue 以后,当其中的描述符状态发生变化时,kqueue 将一次性通知应用程序哪些描述符可读、可写或出错了。
kqueue 支持多种类型的文件描述符,包括 socket、信号、定时器、AIO、VNODE、PIPE。本文重点讨论 kqueue 如何控制 socket 描述符。其中 kqueue 对 AIO,POSIX 的异步 IO 系列的支持,是异步行为完成通知机制之一。另外两种常见的机制是异步信号和线程例程。用 kqueue 的明显好处是完成事件的处理线程可以灵活地指定。
本文重点在于 kqueue 技术本身。一些基础的知识点,比如 socket API 和常用的 Unix 数据结构将不作讲解,有需要的读者请先阅读 UNIX 网络编程方面书籍。
kqueue APIs
kqueue 提供 kqueue()、kevent() 两个系统调用和 struct kevent 结构。
kqueue 主要功能
通过 kevent() 提供三个主要的行为功能。在下面小节中将会用到这两个主要功能。
注册 / 反注册
注意 kevent() 中的 neventlist 这个输入参数,当将其设为 0,且传入合法的 changelist 和 nchangelist,就会将 changelist 中的事件注册到 kqueue 中。
当关闭某文件描述符时,与之关联的事件会被自动地从 kqueue 移除。
允许 / 禁止过滤器事件
通过 flags EV_ENABLE 和 EV_DISABLE 使过滤器事件有效或无效。这个功能在利用 EVFILT_WRITE 发送数据时非常有用。
更多精彩
赞助商链接