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

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

 2010-05-21 00:00:00 来源:WEB开发网   
核心提示: 将上面代码中的 EV_DISABLE替换成 EV_ENABLE表示事件是可用的,接下来,使用 kqueue 在 FreeBSD 上开发高性能应用服务器(7),考虑一个实际的服务器应用,请见图 3,一般将 socket IO 设置成非阻塞模式,以提高读写性能的同时,图 3. 某个服务器应用逻辑处理

将上面代码中的 EV_DISABLE替换成 EV_ENABLE表示事件是可用的。

接下来,考虑一个实际的服务器应用,请见图 3。

图 3. 某个服务器应用
使用 kqueue 在 FreeBSD 上开发高性能应用服务器

逻辑处理线程将处理结果写到发送队列,通信线程将其读出并通过 kqueue EVFILT_WRITE 机制发送。二者具体流程请见图 4。

图 4. 逻辑流程
使用 kqueue 在 FreeBSD 上开发高性能应用服务器

查看原图(大图)

具体的代码相对较大,将不在这里列出。在 Speed 库 demos/fb_tcp_server 有这种用法的代码例子。特别强调一下,两个线程中 writeEnable 变量和 EVFILTE_WRITE 状态的设置是有严格的顺序要求的。现代编译器优化和处理器执行指令时都有可能打乱指令顺序。有一种叫内存屏障(memory barrier)的技术可以保证程序语句的编译和执行顺序,在 Linux 内核设计与实现中介绍了这一技术。

另外,这个例子可以做性能优化,当发送队列为空时,将一定长度的数据直接通过 send()API 非阻塞地发送,未发送完的数据再写入到发送队列。这样避免了大部分的数据拷贝。

阻塞与非阻塞 IO

用过 select 和 epoll 的读者,一般将 socket IO 设置成非阻塞模式,以提高读写性能的同时,避免 IO 读写不小心被锁定。

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

Tags:使用 kqueue FreeBSD

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