WEB开发网
开发学院操作系统Linux/Unix 使用 kqueue 在 FreeBSD 上开发高性能应用服务器 阅读

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

 2010-05-21 00:00:00 来源:WEB开发网   
核心提示: 108~111,根据 events.ident 的类型来调用 Accept() 或 Receive(),使用 kqueue 在 FreeBSD 上开发高性能应用服务器(6),这里要注意的是 events[i].data,117~126,应用程序须要禁止 kqueue 不断地通知某个描述符的&ld

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 在 FreeBSD 上开发高性能应用服务器

在某种情形下,应用程序须要禁止 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); 

上一页  1 2 3 4 5 6 7 8  下一页

Tags:使用 kqueue FreeBSD

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接