- 论坛徽章:
- 0
|
原帖由 benjiam 于 2008-6-7 20:16 发表 ![]()
说老实话 我做得东西 也用到epoll 和iocp
本来想封装在一起, 但后来我发现 2者的实现差距很大, 并不适合封装在一起。
比如epoll 的消息都是一个线程回来的。 而iocp 可以多个线程同时取回来
epoll 在处理消息的时候 为了效率 可以多线程处理。 其实这个涉及到一个比较复杂的任务分配,回收的过程。 我感觉2者不太容易融合起来
说到融合ace 早就做到了。但是效率是不是高? 我不知道。
libevent 的那个 我可能弄错了 但我记得 1.3xx 的时候 我苗了一眼 好像有win32 的
libevent 一直都有 win32 的版本啊,不过是用 select 来实现的。win32 默认是最多 64 个 fd ,可以通过一些手段增加 fd 。
不过增大之后,性能就难说了,在 <Network Programming for Microsoft Windows, Second Edition> 里面,有一节专门的对比结果。
epoll 和 常规的 iocp 的主要区别在于发起操作的方式和通知的时机不同
1.epoll 发起操作是先 epoll_ctl 添加事件,接着 epoll_wait ,接着进行 recv/send
2.常规的 iocp 发起操作是直接用 WSASend/WSARecv ,接着 GetQueuedCompletionStatus ,然后被通知操作已经完成
这次把 iocp 和 epoll 融合起来,在于使用了 iocp 的一个特殊的地方:zero byte buffer 。
也就是在 WSASend/WSARecv 的时候,可以指定一个长度为 0 的 buffer ,这样当 GetQueuedCompletionStatus 返回的时候,
才再次调用 WSASend/WSARecv 真正来发送数据。当使用 zero byte buffer 的策略时,iocp 的流程就变得和 epoll 很类似了。
这种很类似的流程,就可以很方便地融合了。这样的做法,相当于可以用 iocp 无缝地实现 libevent 原来所有的功能。
另一方面,关于 iocp 的一些其他集成难点,也可以顺利地得到解决。比如常常会被问到的 iocp 和 ssl 怎么集成的问题。
ace 的融合,采用的是另外的方法。按 ace 的名词来说,libevent 的 epoll 是 reactor ,这次集成的 iocp 也是 reactor 。
ace 自身集成 epoll 和 iocp 的方式,用的不是 reactor ,而是 proactor 。
[ 本帖最后由 iunknown 于 2008-6-7 20:58 编辑 ] |
|