摘要: 在上一篇文章里,我们分析了libev整体设计思想和主循环的工作原理,也提到了watcher是衔接开发者代码的主要入口。watcher与开发者最接近,也与具体事件处理逻辑最接近。所以,watcher的具体实现,与性能的关系也相当密切。下面,我们就来分析一下,libev中常用的几种watcher的设计与实现。ev_ioev_io与底层ioev_io的主要使命就是监听并响应指定文件描述fd上的读写事件。对fd的监听工作,主要委托给底层的io库来完成。libev对目前比较流行的io库都提供了支持,如:select, epoll以及windows的iocp等。在这里libev使用了Adaptor模式,通 阅读全文
posted @ 2013-05-03 23:57 qimi 阅读(2907) 评论(0) 推荐(1) 编辑
摘要: libev是Marc Lehmann用C写的高性能事件循环库。通过libev,可以灵活地把各种事件组织管理起来,如:时钟、io、信号等。libev在业界内也是广受好评,不少项目都采用它来做底层的事件循环。node.js也是其中之一。 学习和分析libev库,有助于理解node.js底层的工作原理,同时也可以学习和借鉴libev的设计思想。本文是最近在学习libev源码的一些心得总结吧。libev示例先上一个例子,看看libev是怎么使用的吧。12345678910111213141516171819202122232425262728293031323334353637383940414243 阅读全文
posted @ 2013-05-03 23:56 qimi 阅读(3480) 评论(0) 推荐(2) 编辑
摘要: libev 设计分析此文主要分析libev 的设计架构与算法实现,阅读这篇文章之前,你需要对libev 的使用有大致的了解;libev 提供了很多watcher 供开发者使用 ,以下仅对最重要最常用的几个watcher 机制进行分析,从中我们可掌握整个libev的设计思想,如果你想了解更多,可查阅libev的相关代码或文档。ev_io_watcher如我们所知,新的fd总是系统可用的最小fd ,所以这个长度可以进行大小限制的,我们用一个连续的数组来存储fd/watch 信息,如下图所示,我们用anfd[fd] 就可以找到对应的fd/watcher 信息,当然可能遇到anfd超出我们的buffe 阅读全文
posted @ 2013-05-03 15:15 qimi 阅读(843) 评论(0) 推荐(1) 编辑
摘要: 这里选取的版本为最新版:libev-4.04。libev的代码很简练,除了对高效I/O模型等的封装文件,核心文件就两个:ev.h和ev.c,其中ev.c大概4000行左右。代码大量用到了宏,并且宏还嵌套了宏,为了便于理解libev的代码,这里对宏进行了还原。ev_watcher结构体(其成员为其它结构的公共部分):typedefstruct ev_watcher {int active;//激活标识int pending;//等待事件数int priority;//优先级void* data;//void (*cb)(struct ev_loop* loop, struct ev_watche 阅读全文
posted @ 2013-05-03 15:06 qimi 阅读(672) 评论(0) 推荐(0) 编辑