Chinaunix首页 | 论坛 | 博客
  • 博客访问: 492588
  • 博文数量: 78
  • 博客积分: 995
  • 博客等级: 准尉
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-15 20:22
个人简介

技术中沉思的时候最快乐,问题得到完美解决的时候最有成就感!

文章分类

全部博文(78)

文章存档

2013年(39)

2012年(37)

2011年(2)

分类: LINUX

2013-03-08 23:53:10

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:
        


阅读(3742) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~