1 Star 0 Fork 8

liang.2000/libgo

forked from Gitee 极速下载/libgo 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
TODO 4.13 KB
一键复制 编辑 原始数据 按行查看 历史
TODO:
增加可以与async模型配合使用的协程池, 用户可以将同步网络操作或其他阻塞的请求投递进来(比如:mysql操作),
将用户的主循环也放入协程中执行, epollwait变成poll2个fd, 一个epollfd, 一个callback-fd, 以便快速响应.
触发后在hook过的用户的epollwait/kqueue/iocp里面调用callback, 以此保证callback和触发点在同一个或同一组线程
投递时:if (!channel.TryPush(xx)) go { func(xx); while (co_num < maxPoolNum) { channel >> x; func(x); }}
实现一个连接池, 与协程池搭配使用, 简化mysql\hiredis等库的使用方式.
支持同时等待多个Channel
优化sync库(仿照futex的实现, 尝试无锁队列实现channel)
master分支兼容macos
解决第三方库、glibc++ exception使用tls的隐患(pthread_xxx_specific ?)
Deprecated:
协程对象Task内存布局调优,tls池化,每个池使用多写一读链表队列,申请时仅在当前线程的池中申请,可以免锁,释放时均衡每个线程的池水水位,可以塞入其他线程的池中。
环切(runnable状态)搭配星切, 提升协程切换性能
A)使用环切调度替代现在的星切调度(CoYeild时选择下一个切换目标),必要时才切换回线程处理epoll、定时器、sleep等逻辑,同时协调好多线程调度
B)调度器的Run函数里面做了很多协程切换之外的事情,尽量降低这部分在非必要时的cpu消耗,比如:有任务加入定时器是设置一个tls标记为true,只有标记为true时才去处理定时器相关逻辑。
C)调度器中的runnable队列使用了自旋锁,没有竞争时对原子变量的操作也是比较昂贵的,runnable队列可以优化成多写一读,仅在写入端加锁的队列。
DONE:
支持exception
优化co_mutex, 为BlockWait抽象出一个WaitObject, 管理等待中的协程, 以免不同的WaitObject竞争同一个全局锁
阻塞socket的超时设置(RECVTIMEO, SENDTIMEO)在协程中处理
修复gtest单元测试代码链接错误的问题
支持poll
支持accept
支持asio
降低空转时的cpu资源占用
解决http性能测试出现error, 无法加入epoll的问题
支持sleep nanosleep poll(timeout)
正确处理Add into epoll, add into wait_list, set timer And epoll_wait, cancel这几件事的同步关系
支持select
支持channel特性
添加命名空间
HOOK read write时, 不要影响读文件
使用shared-stack方案, 降低一点点协程切换速度换取内存的节约使用, 支持创建海量协程
网络IO以外的阻塞调用, 可以使用co_await异步化
select中对exceptfds正确检测!
移植Windows:
1.HOOK WINAPI, 使用多select模型
Hook List: accept connect select WSARecv WSASend
2.ucontext->windows.fiber
WIN HOOK: send recv WSARecv** WSASend**
重新尝试boost.context\boost.coroutine
增加编译选项:ENABLE_BOOST_COROUTINE DISABLE_HOOK ENABLE_SEGMENTED_STACK
支持多个线程poll同一个fd
HOOK close接口, 正确模拟阻塞式read/write中被close时的行为(close后唤醒等待这个fd的协程)
优化性能, HOOK的syscall中减少syscall的调用, 使用缓存数据, 避免频繁切换内核态
改进定时器, 从双红黑树改为单红黑树, 提升性能
改进定时器, 加快cancel的速度.(方案1.使用侵入式红黑树. 方案2.保存iterator)
Work Stealing...
__attribute__ ((always_inline))
调度器重入不再crash
HOOK select poll时, 正确处理文件等非socket句柄
打造类似TLS的CLS(协程局部对象)
hook __poll, 源syscall使用__libc_poll, 以支持gethostbyname系列函数
解决并发调用gethostbyname_r时,内部共用同一个udp socket的问题
用户调用过poll的fd应该设置对应的readable\writable, 降低io的latency
go dispatch(xx) stack(xxx) malloc-free(xx,yy) func;用这种灵活的语法替代go_dispatch这种老旧的方式。
协程亲缘性
调度器改成多个(1个默认的全局调度器+多个用户自定义调度器), 去除全局访问点, go增加参数指定调度器.
以glibc的静、动态链接方式来区分hook实现方法, 而不是libgo库本身.(try:优先尝试dlysm, 失败后再用__xxx的方式)
Scheduler::Stop用于安全退出main函数
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liang-2000/libgo.git
git@gitee.com:liang-2000/libgo.git
liang-2000
libgo
libgo
master

搜索帮助