2016-12-07 ruki
此版本主要增加stackless协程模块以及为嵌入式平台增加micro微模块编译(~64K)。 此stackless协程模块比之前的stackfull协程实现更加的轻量高效,切换效率提升5、6倍,在macosx上测试1000w次切换仅需40ms 当然易用性和灵活性上,还是stackfull模式更有优势(tbox两种模式都已支持,接口类似)。 stackless协程使用见:stackless协程使用文档 stackfull协程使用见:stackfull协程使用文档 更多协程服务器demo实现,请参考:协程examples 新特性 针对协程上下文切换,支持mips架构 添加__tb_thread_local__关键字宏 添加 继续阅读 »
2016-12-03 ruki
tbox之前提供的stackfull协程库,虽然切换效率已经非常高了,但是由于每个协程都需要维护一个独立的堆栈, 内存空间利用率不是很高,在并发量非常大的时候,内存使用量会相当大。 之前考虑过采用stacksegment方式进行内存优化,实现动态增涨,但是这样对性能还是有一定的影响,暂时不去考虑了。 最近参考了下boost和protothreads的stackless协程实现,这种方式虽然易用性和灵活性上受到了很多限制,但是对切换效率和内存利用率的提升效果还是非常明显的。。 因此,我在tbox里面也加上了对stackless协程的支持,在切换原语上参考了protothreads的实现,接口封装上参考了boost的设计,使得更加 继续阅读 »
2016-12-03 ruki
tbox provides a lightweight implementation of stackless coroutines and it's interfaces are very simple too, for example: c tb_lo_coroutine_enter(coroutine) { while (1) { tb_lo_coroutine_yield(); } } The switch performance of this stackless coroutines is faster than the implementation of tbox's 继续阅读 »
2016-12-07 ruki
Stackless introduction Stackfull introduction More coroutine examples New features Support coroutine context switch for mips Add __tb_thread_local__ keyword macro Add --micro=y|n option to compiling micro library (~64K) for the embed system Add tb_addrinfo_addr and tb_addrinfo_name interfaces Add stackless coroutine A 继续阅读 »
2016-12-07 ruki
之前介绍过了stackfull的一些服务器使用例子,这里在贴一些使用stackless协程接口实现的server代码。 其实大部分接口,两者都是类似的,仅仅只是前缀的区别:tb_co_xx 和 tb_lo_xx,唯一需要注意的是: * stackless协程尽量不要使用局部变量 * 不要再嵌套的过程里面进行协程挂起等待 文件接收服务器 这个文件服务器的功能很简单,就是不停的接收连接,然后开新协程,进行文件传输。 通过协程,从原始socket写起,也只需要不到100行代码,就可以实现一个高并发的文件服务器。 此处用到了tb_socket_sendf直接对文件句柄操作,发送到socket,内部使用sendfile实现,不 继续阅读 »
2016-10-28 ruki
协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持。 最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, boost, libco, libgo等等。 他们都属于stackfull协程,每个协程有完整的私有堆栈,里面的核心就是上下文切换(context),而stackless的协程,比较出名的有protothreads,这个比较另类,有兴趣的同学可以去看下源码,这里就不多说了。 那么现有协程库,是怎么去实现context切换的呢,目前主要有以下几种方式: 使用ucontext系列接口,例如:libtask 使用setjmp/longjm 继续阅读 »