使用 kqueue 在 FreeBSD 上开发高性能应用服务器

论坛 期权论坛     
选择匿名的用户   2021-5-26 13:29   480   0
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> <a name="major1"><span class="atitle" style="font-size:1.5em; font-weight:bold">概述</span></a></p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> kqueue 是 FreeBSD 上的一种的多路复用机制。它是针对传统的 select/poll 处理大量的文件描述符性能较低效而开发出来的。注册一批描述符到 kqueue 以后,当其中的描述符状态发生变化时,kqueue 将一次性通知应用程序哪些描述符可读、可写或出错了。</p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> kqueue 支持多种类型的文件描述符,包括 socket、信号、定时器、AIO、VNODE、PIPE。本文重点讨论 kqueue 如何控制 socket 描述符。其中 kqueue 对 AIO,POSIX 的异步 IO 系列的支持,是异步行为完成通知机制之一。另外两种常见的机制是异步信号和线程例程。用 kqueue 的明显好处是完成事件的处理线程可以灵活地指定。</p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> 本文重点在于 kqueue 技术本身。一些基础的知识点,比如 socket API 和常用的 Unix 数据结构将不作讲解,有需要的读者请先阅读<a href="http://www.ibm.com/developerworks/cn/aix/library/1105_huangrg_kqueue/#resources" style="color:rgb(153,102,153)">UNIX 网络编程方面书籍</a>。</p>
<div class="ibm-alternate-rule" style="clear:both; background-color:rgb(255,255,255); height:1px">
</div>
<p class="ibm-ind-link ibm-back-to-top" style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:5px; font-size:0.76em; clear:both; text-align:right; height:15px; background-color:rgb(255,255,255)"> <a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/aix/library/1105_huangrg_kqueue/#ibm-pcon" style="color:rgb(153,102,153); display:inline; margin:0px; padding:0px 0px 0px 18px; font-weight:bold">回页首</a></p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> <a name="major2"><span class="atitle" style="font-size:1.5em; font-weight:bold">kqueue APIs</span></a></p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> kqueue 提供 kqueue()、kevent() 两个系统调用和 struct kevent 结构。</p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> <a name="minor2.1"><span class="smalltitle" style="font-size:1.2em; font-weight:bold">kqueue 主要功能</span></a></p>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> 通过 kevent() 提供三个主要的行为功能。在下面小节中将会用到这两个主要功能。</p>
<ul style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:5px; font-size:0.76em; background-color:rgb(255,255,255)"><li style="font-family:arial,nsimsun,sans-serif; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:3px"> 注册 / 反注册 <p style="margin:0px; padding:0.3em 5px 0px 0px; font-size:1em">注意 kevent() 中的 neventlist 这个输入参数,当将其设为 0,且传入合法的 changelist 和 nchangelist,就会将 changelist 中的事件注册到 kqueue 中。</p> <p style="margin:0px; padding:0.3em 5px 0px 0px; font-size:1em">当关闭某文件描述符时,与之关联的事件会被自动地从 kqueue 移除。</p> </li></ul>
<ul style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:5px; font-size:0.76em; background-color:rgb(255,255,255)"><li style="font-family:arial,nsimsun,sans-serif; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:3px"> <code style="font-family:monospace; font-size:small!important">允许 / 禁止过滤器事件</code> <p style="margin:0px; padding:0.3em 5px 0px 0px; font-size:1em">通过 flags EV_ENABLE 和 EV_DISABLE 使过滤器事件有效或无效。这个功能在利用 EVFILT_WRITE 发送数据时非常有用。</p> </li></ul>
<ul style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:5px; font-size:0.76em; background-color:rgb(255,255,255)"><li style="font-family:arial,nsimsun,sans-serif; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-right:5px; padding-bottom:3px"> 等待事件通知 <p style="margin:0px; padding:0.3em 5px 0px 0px; font-size:1em">将 nchangelist 设置成 0,当然要传入其它合法的参数,当 kevent 非错误和超时返回时,在 eventlist 和 neventlist 中就保存可用事件集合。</p> </li></ul>
<p style="font-family:arial,nsimsun,sans-serif; margin:0px; padding:0.3em 5px 0.7em; font-size:0.76em; background-color:rgb(255,255,255)"> <a name="minor2.2"><span class="smalltitle" style="font-size:1.2em; font-weight:bold"
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP