![](https://img-blog.csdnimg.cn/20190126175541694.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Tencent/libco 源码阅读与网络库实现
记录自己在用C++实现协程网络库时,对 libco 的一些理解和感受
Tattoo_Welkin
Just do it !!!
展开
-
使用 setcontext 类函数实现 mini 协程库
协程实现原理协程的本质都是通过修改 ESP 和 EIP 指针来实现的。其理论上还是单线程在运行.程序在CPU上运行时依赖3个寄存器:ESP寄存值指向当前栈顶地址,指向当前指令需要的数据EBP指向当前活动栈帧的基地址指令寄存器IP,指向当前需要运行的指令实现协程的多种方法利用 glibc 的 ucontext 组件(云风的库)使用汇编来切换上下文(实现miniC协程,腾讯lib...原创 2018-12-20 22:56:00 · 1873 阅读 · 0 评论 -
云风协程库保存和恢复协程运行栈原理讲解
首先, linux下的进程地址空间布局是这样子的:可以看到 整个进程地址空间从上到下地址变化是从高地址到低地址的! 32 位系统有 4G 的地址空间,其中0x08048000-> 0xbfffffff 是用户空间,0xc0000000~0xffffffff 是内核空间,包括内核代码和数据、与进程相关的数据结构(如页表、内核栈)等。其实就是大体上就是下面这样:另外, %esp 执...原创 2018-12-20 15:33:26 · 861 阅读 · 0 评论 -
Libco协程切换的原理
Libco协程切换声明:下面的都是参考Libco 协程栈的切换理解函数调用的原理linux 程序内存布局传统linux程序(32bit)拥有4G的虚拟内存区域,高1G的区域供内核使用,剩余的3G内存供程序使用。按段划分,主要分程序段(text segement)、数据段、BSS段。BSS段用于未初始化的静态变量的初始化(0值初始化)。栈从高到低地址增长。堆从低到高增长。栈和堆的这两种不同的...原创 2019-03-07 15:52:42 · 1234 阅读 · 0 评论 -
libco 共享栈测试分析与实现
5. 共享栈模式这种做法有什么好处?其实我们可以直接想想以前的方法(每个协程单独分配栈)有什么坏处好了:以前的方法为每个协程都单独分配一段内存空间,因为是固定大小的,实际使用中协程并不能使用到这么大的内存空间,于是就会造成非常大的内存浪费(有同学一定会问为什么不用 Split Stack ,这个东西的性能有多垃圾有目共睹)。而且因为绝大多数协程使用的栈空间都极少,复制栈空间的开销非常小...原创 2019-01-19 16:15:40 · 916 阅读 · 0 评论