yifei -- a project named with the name of my daughter
功能包括:
一,库基础依赖api及数据结构
i) unix system 系统调用等薄包装 -> src/ppc/
主要屏蔽unix,linux各系统之间的差异,比如;socket等等
ii) system相关的一些资源包装: -> src/ppc/
比如:进程相关,线程相关,信号,共享内存,时间戳(时间缓存+多线程支持--类似errono)
锁,快速锁(利用与cpu平台相关的汇编代码生成,比pthread的锁要快,平稳,类似内核中的spinlock)
atexit 升级(系统自带atexit太弱)
iii)非常丰富且效率极高的数据结构 -> src/base_struct
[内存池]: yifei 整个库的基石,除了内存分配,还起到映射寻址等重要功能,包括3类
1)定长,定数量;
2)定长,数量自动伸缩;
//以上两类都支持从id到节点的快速映射(非常迅速,避免使用者建立id->节点的映射map)
3)变长(类似stl的内存池);4)多次分配,一次销毁(来源于nginx)//适合生存时间不长的过程体
//实现代码都值得看看研究
[位操作]: 非常基础且非常重要的库,基本上处处用到,主要功能有:
位操作,对齐,寻址,数字合并拆分,计数
[id分配器]:非常基础且非常重要的库,用于生成空间/时间唯一且值很大的的64位id(why big?),
用于各个地方(比如内存分配的节点,定时器,协程等等)
且在多线程下,效率不降低(really? how? 看代码)
[list]: 浸入式的slist,list,和linux内核用的链表基本一致,
特点:浸入|异常灵活|效率奇高(stl::list易用但性能灵活差太远)
基本所有的模块都以 内存池 和 list 为基础组织的;
[log]: 最重要的特点:留下了扩展接口,支持自由扩展,参考 log_ext
[string]: 带len的string,且有一组非常丰富的函数(来源于nginx)
[rbtree]: 暂时还没用到,感觉尽量少用复杂数据结构,能用内存池和list能解决最好
往往简单的效率高,代码看起来也华丽丽的!
注:其实不需要复杂的算法,不需要复杂的数据结构,数据结构一定要灵活,高效,且易于融入使用者环境
ix) 一个log扩展,带缓冲,后台独立子线程sync到硬盘,不会阻塞其他线程;重要功能:
带缓冲 -- 突破log io瓶颈
保证程序core或者被kill缓冲日志不丢 -- 即使缓冲还是能保证不丢日志
少日志时自动定时sync
二,类似 libevent 的一个跨linux/solars/FreeBSD/SunOS/Darwin等
unix system平台的一个异步事务驱动器,包括事件类型:
i) fd 句柄
ii) signal 信号
iii) timer 定时器
ix) proc 子进程调用
三,独创的服务器各类运行实例通信交互模式工厂,已实现模式有:
i) 父进程(非阻塞/异步) -> 子进程(非阻塞/异步)
ii) 父线程(非阻塞/异步) -> 子线程(非阻塞/异步)
iii)父线程(非阻塞/异步) -> 子线程(阻塞/同步)
简单描述:
三者之间其实还是有简单的层级关系的
第一层是基础api,第二层是异步框架,第三层其实是一个业务框架;
第一层没有单独应用的意义,第二层实际上是可以单独使用的(即也许根本不需要第三层)
那第三层做什么用呢?第三层其实利用了第二层来实现了业务框架,可能会用到的地方:
1,弥补第二层的薄弱,因为第二层异步框架完全异步,非阻塞,但是是单线程的。不能真正并行利用cpu
比如:可以把网络层拆分到多个异步框架线程里面去,每线程一个异步框架;//子线程非阻塞异步
或者把cpu密集型的调用剥离到辅助线程里面去,子线程专门辅助计算; //子线程阻塞同步等待任务
2,另外最重要的原因是,在某些条件下,确实避免不了阻塞,比如:memcached, mysql 等等库函数都是阻塞的
这种阻塞的调用是不能出现在异步框架中的,必须剥离到单独的子线程中去...
当然:这种剥离是非常恶心的...
所有的目的是什么?为了能把阻塞变成非阻塞,把所有的行为都演变成了回调!!
代码特点:
1,尽量使接口简单,keep it simple;如果不能做到简单,just keep it complicated, then hide it;
所以接口头部中的暴露的数据结构往往只是整个结构的很小一部分,其他的字段都采用内存便宜做了隐藏处理;
2,大量的位操作,大量的内存对齐,包括:
cpu 访问对齐,cpu cache 对齐,内存page边界对齐;
3,大量的宏和条件编译,有些是为了可移植,更多是为了写代码方便高效;
4,各种内存池和list为基本甚至全部的工具组织数据结构;
5,单元测试非常丰富全面,单元测试基本伴随库开发一路走来,和库代码一样价值不菲;
使用介绍:
此项目是一个工具库,可用于unix后台异步server的搭建
安装:configue; make; make install;
使用方法见 test/ 目录中的单元测试程序,主要有三个:
yf_base_testor.cpp
yf_driver_testor.cpp
yf_bridge_testor.cpp
Author:
name: kevin_zhong
mail: qq2000zhong@gmail.com
url:
阅读(551) | 评论(0) | 转发(0) |