0%

Seafile是一款非常优秀的跨平台的国产开源企业云存储软件,Github上的仓库已经拥有了超过6000的star。由于工作的原因,学习了一段时间的seafile,这里将我的一些心得记录下来,但愿帮助后来者少走一点弯路。

Seafile功能强大,组件丰富,社区版本可以在其官网下载到,https://www.seafile.com/download/。服务端同时支持Linux和Windows,文档也很详细,按照https://manual-cn.seafile.com/部署起来并不复杂。

阅读全文 »

本来准备将这节的内容直接写到《抽丝剥茧libevent——初识event》一节,后边发现,越写越多,changlist好像并不是那么容易就可以描述清楚的,于是单开一节专门来讲changelist。

对事件的操作,到最后都会转换为对fd的操作————修改epoll兴趣列表。也就是说每一次event_add/event_del最终都会导致一次epoll_ctl系统调用,但是系统调用的开销很大(系统调用真正的效率瓶颈在哪里?)。changelist正是一种能减少epoll_ctl调用的机制。

阅读全文 »

event_base是libevent里另外一个核心的结构,它是存放各种事件集的容器,同时也是libevent事件循环(event loop)的主要结构。和event一样,它也是不透明结构。

每个libevent程序都必须创建至少一个event_base结构。如果需要多个线程监听I/O的话,需要为每个线程分配一个event_base(推荐的做法是one loop per thread)。

本文可能不会详尽event_base每个字段含义,libevent盘根错节,先抽取出一条主线,逐渐深入每一处细节。

阅读全文 »

从这章起正式进入libevent的源码部分,libevent是事件驱动(event-driven)的网络库,事件是一切操作的基本单元,那么就从event说起。

首先event是一个不透明结构(opaque structure),对于使用者来说,无需关心它的内部数据结构。所有对event的操作,都需要通过libevent提供的接口,不能自己私自操作其中的数据(不得不感慨一下,指针还是给了程序员太大的自由了)。这样做的好处主要有两个,通用编程技法一章已经提到过了:信息封装和二进制兼容。对于一个动态库来讲,这两个特性尤为重要。

阅读全文 »

现代网络库通常基于reactor模式或者proactor模式。使用这两种模式,可以将具体业务从网络框架中分离出去,从而降低耦合。 这两者的基本概念是:如何深刻理解reactor和proactor?

由于Linux缺少完备的系统异步I/O支持,proactor模式在LInux上玩不转。Windows上的IOCP通常可以用来实现proactor。

libevent采用的是reactor模式。

阅读全文 »