使用 kqueue 在 FreeBSD 上开发高性能应用服务器
2010-05-21 00:00:00 来源:WEB开发网108~111,根据 events.ident 的类型来调用 Accept() 或 Receive()。这里要注意的是 events[i].data。
117~126,对于监听 socket,data 表示连接完成队列中的元素 ( 已经收到三次握手最后一个 ACK) 个数。119 行演示了这种用法,accept data 次。126 行将 accept 成功的 socket 注册到 kq。
136~145,对于流 socket,data 表示协议栈 socket 层的接收缓冲区可读数据的字节数。recv 时显示地指定接收 availBytes 字节 ( 就是 data)。这个功能点将对 recv 和 send 的性能提升有积极的作用,第 4 小节将这方面的讨论。145 行表示将收到的数据入缓冲队列。
EVFILT_WRITE 用法
上面的例子没有涉及写事件的用法,这一小节简单介绍一下通过 WRITE 事件自动地实现发送数据的方法。
kqueue 默认是水平触发模式,当某个描述符的事件满足某种条件时,如果应用程序不处理对应的事件,kqueue 将会不断地通知应用程序此描述符满足某种状态了。以 EVFILT_WRITE 举例,见图 2。
图 2. WRITE 通知流程
在某种情形下,应用程序须要禁止 kqueue 不断地通知某个描述符的“可写”状态。将已注册的 {ident, filter} 的 flags 设置成 EV_DISABLE 就达到这个目的。实现方法类似清单 4。
清单 4. 实现方法
struct kevent changes[1];
EV_SET(&changes[0], fd, EVFILT_WRITE, EV_DISABLE, 0, 0, NULL);
kevent(kq, changes, 1, NULL, 0, NULL);
更多精彩
赞助商链接