免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iunknown
打印 上一主题 下一主题

[C] 集成 IOCP 到 Libevent [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-06 17:25 |只看该作者
原帖由 iunknown 于 2008-6-6 08:20 发表


看到有一个 libevbase 的库,说是 “ libevbase Library for replacing libevent ”,比起 libevent 有什么优势吗?


我就自己实现了一下....呵呵

libevent好像不能多线程同时使用event base吧因为它只有一个event base

论坛徽章:
0
12 [报告]
发表于 2008-06-06 17:41 |只看该作者
原帖由 redor 于 2008-6-6 17:25 发表


我就自己实现了一下....呵呵

libevent好像不能多线程同时使用event base吧因为它只有一个event base


memcached 从 1.2 开始支持多线程,底层的 socket 就是用的 libevent 。

libevent 的 event_init 方法的返回值就是一个 event_base ,对于每一个 event 可以调用
struct event_base *event_init(void);

/* Associate a different event base with an event */
int event_base_set(struct event_base *, struct event *);


因此 libevent 是可以有多个 event_base 的。

libevent 和 多线程组合来使用,目前也已经比较常见。比较常见的方法有
1.类似 memcached ,每个线程各自一个 event_base ,不会互相影响
2.使用 event_msgqueue ,可以参考 Passing data between event loops in multithreaded apps
http://monkeymail.org/archives/l ... October/000257.html

论坛徽章:
0
13 [报告]
发表于 2008-06-06 17:45 |只看该作者
原帖由 iunknown 于 2008-6-5 21:06 发表


这个。。。。。。

IOCP 不就是 windows 的异步 IO 接口吗?难道 IOCP 还有另外的解释?

IOCP是IO完成端口,使不使用完成端口才是IOCP的体现。

论坛徽章:
0
14 [报告]
发表于 2008-06-06 17:47 |只看该作者
原帖由 redor 于 2008-6-6 17:25 发表


我就自己实现了一下....呵呵

libevent好像不能多线程同时使用event base吧因为它只有一个event base


自己实现一个也不错,不过初步看了一些代码,好像没有详细测试过?有些代码会导致错误。

论坛徽章:
0
15 [报告]
发表于 2008-06-06 17:49 |只看该作者
原帖由 yovn 于 2008-6-6 17:45 发表

IOCP是IO完成端口,使不使用完成端口才是IOCP的体现。



“使用完成端口” 是指什么呢?怎么才算是使用了完成端口呢?
程序使用 CreateIoCompletionPort,WSARecv,WSASend,GetQueuedCompletionStatus 这些算不算呢?

论坛徽章:
0
16 [报告]
发表于 2008-06-06 18:12 |只看该作者
原帖由 iunknown 于 2008-6-6 17:49 发表



“使用完成端口” 是指什么呢?怎么才算是使用了完成端口呢?
程序使用 CreateIoCompletionPort,WSARecv,WSASend,GetQueuedCompletionStatus 这些算不算呢?

我看了你在JavaEye上的介绍,貌似是用Event的而不是使用完成端口,使用完成端口至少该有个Socket绑定到完成端口的过程吧?

论坛徽章:
0
17 [报告]
发表于 2008-06-06 18:20 |只看该作者
下下来了LZ的代码,理解错了,看到了LZ的IOCP了。

论坛徽章:
0
18 [报告]
发表于 2008-06-07 20:16 |只看该作者
说老实话  我做得东西 也用到epoll 和iocp

本来想封装在一起, 但后来我发现 2者的实现差距很大, 并不适合封装在一起。

比如epoll 的消息都是一个线程回来的。 而iocp 可以多个线程同时取回来
epoll 在处理消息的时候 为了效率 可以多线程处理。 其实这个涉及到一个比较复杂的任务分配,回收的过程。 我感觉2者不太容易融合起来

说到融合ace 早就做到了。但是效率是不是高? 我不知道。

libevent 的那个 我可能弄错了 但我记得 1.3xx 的时候  我苗了一眼 好像有win32 的

论坛徽章:
0
19 [报告]
发表于 2008-06-07 20:55 |只看该作者
原帖由 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 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2008-06-07 23:04 |只看该作者
这次把 iocp 和 epoll 融合起来,在于使用了 iocp 的一个特殊的地方:zero byte buffer 。
也就是在 WSASend/WSARecv 的时候,可以指定一个长度为 0 的 buffer ,这样当 GetQueuedCompletionStatus 返回的时候,
才再次调用 WSASend/WSARecv 真正来发送数据。

可以吗?  

可以指定一个长度为 0 的 buffer ,这样当 GetQueuedCompletionStatus 返回的时候,
才再次调用 WSASend/WSARecv 真正来发送数据。

那么新送出的数据可以有多长?
wsasend 是同步还是异步完成。 异步完成何时通知呢? 需要第二次GetQueuedCompletionStatus ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP