使用 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 EVFILT_WRITE 机制发送。二者具体流程请见图 4。
图 4. 逻辑流程
查看原图(大图)
具体的代码相对较大,将不在这里列出。在 Speed 库 demos/fb_tcp_server 有这种用法的代码例子。特别强调一下,两个线程中 writeEnable 变量和 EVFILTE_WRITE 状态的设置是有严格的顺序要求的。现代编译器优化和处理器执行指令时都有可能打乱指令顺序。有一种叫内存屏障(memory barrier)的技术可以保证程序语句的编译和执行顺序,在 Linux 内核设计与实现中介绍了这一技术。
另外,这个例子可以做性能优化,当发送队列为空时,将一定长度的数据直接通过 send()API 非阻塞地发送,未发送完的数据再写入到发送队列。这样避免了大部分的数据拷贝。
阻塞与非阻塞 IO
用过 select 和 epoll 的读者,一般将 socket IO 设置成非阻塞模式,以提高读写性能的同时,避免 IO 读写不小心被锁定。
更多精彩
赞助商链接