Seafile是一款非常优秀的跨平台的国产开源企业云存储软件,Github上的仓库已经拥有了超过6000的star。由于工作的原因,学习了一段时间的seafile,这里将我的一些心得记录下来,但愿帮助后来者少走一点弯路。
Seafile功能强大,组件丰富,社区版本可以在其官网下载到,https://www.seafile.com/download/。服务端同时支持Linux和Windows,文档也很详细,按照https://manual-cn.seafile.com/部署起来并不复杂。
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的初始化过程,上一节的最后给出了一张event_base中管理的各种数据结构的图示。本节就是要探究event_base是如何利用这些结构处理事件的。
event_base是libevent里另外一个核心的结构,它是存放各种事件集的容器,同时也是libevent事件循环(event loop)的主要结构。和event一样,它也是不透明结构。
每个libevent程序都必须创建至少一个event_base结构。如果需要多个线程监听I/O的话,需要为每个线程分配一个event_base(推荐的做法是one loop per thread)。
本文可能不会详尽event_base每个字段含义,libevent盘根错节,先抽取出一条主线,逐渐深入每一处细节。
现代网络库通常基于reactor模式或者proactor模式。使用这两种模式,可以将具体业务从网络框架中分离出去,从而降低耦合。 这两者的基本概念是:如何深刻理解reactor和proactor?。
由于Linux缺少完备的系统异步I/O支持,proactor模式在LInux上玩不转。Windows上的IOCP通常可以用来实现proactor。
libevent采用的是reactor模式。