协程
文章平均质量分 79
Tattoo_Welkin
Just do it !!!
展开
-
云风协程库保存和恢复协程运行栈原理讲解
首先, linux下的进程地址空间布局是这样子的:可以看到 整个进程地址空间从上到下地址变化是从高地址到低地址的! 32 位系统有 4G 的地址空间,其中0x08048000-> 0xbfffffff 是用户空间,0xc0000000~0xffffffff 是内核空间,包括内核代码和数据、与进程相关的数据结构(如页表、内核栈)等。其实就是大体上就是下面这样:另外, %esp 执...原创 2018-12-20 15:33:26 · 870 阅读 · 0 评论 -
使用 setcontext 类函数实现 mini 协程库
协程实现原理协程的本质都是通过修改 ESP 和 EIP 指针来实现的。其理论上还是单线程在运行.程序在CPU上运行时依赖3个寄存器:ESP寄存值指向当前栈顶地址,指向当前指令需要的数据EBP指向当前活动栈帧的基地址指令寄存器IP,指向当前需要运行的指令实现协程的多种方法利用 glibc 的 ucontext 组件(云风的库)使用汇编来切换上下文(实现miniC协程,腾讯lib...原创 2018-12-20 22:56:00 · 1900 阅读 · 0 评论 -
libco 共享栈测试分析与实现
5. 共享栈模式这种做法有什么好处?其实我们可以直接想想以前的方法(每个协程单独分配栈)有什么坏处好了:以前的方法为每个协程都单独分配一段内存空间,因为是固定大小的,实际使用中协程并不能使用到这么大的内存空间,于是就会造成非常大的内存浪费(有同学一定会问为什么不用 Split Stack ,这个东西的性能有多垃圾有目共睹)。而且因为绝大多数协程使用的栈空间都极少,复制栈空间的开销非常小...原创 2019-01-19 16:15:40 · 949 阅读 · 0 评论 -
Libco协程切换的原理
Libco协程切换声明:下面的都是参考Libco 协程栈的切换理解函数调用的原理linux 程序内存布局传统linux程序(32bit)拥有4G的虚拟内存区域,高1G的区域供内核使用,剩余的3G内存供程序使用。按段划分,主要分程序段(text segement)、数据段、BSS段。BSS段用于未初始化的静态变量的初始化(0值初始化)。栈从高到低地址增长。堆从低到高增长。栈和堆的这两种不同的...原创 2019-03-07 15:52:42 · 1394 阅读 · 0 评论 -
MyLibco 协程网络库定时器的设计
时间戳类(基本摘自muduo)定时器定时器容器原创 2019-03-16 21:27:55 · 473 阅读 · 0 评论 -
简述 Libco 的 hook 层技术
文章目录什么是Hook层?静态链接库加载时的动态链接(可省略,编译原理得好好学了,深入理解计算机系统也该看看了)运行时的动态链接实例:(1)使用LD_PRELOAD(2)不使用LD_PRELOAD总结:libco中的hook技术实例: libco中的read函数什么是Hook层?就是通过 hook 系统的 socket 函数族来实现无需修改代码的异步化改造。简单来说,就是利用动态链接的原理来修...翻译 2019-03-12 15:29:04 · 1638 阅读 · 0 评论 -
从 example_echosvr.cpp 认识 Libco 事件循环
主函数:int main(int argc, char *argv[]){ g_listen_fd = CreateTcpSocket(port, ip, true); listen(g_listen_fd, 1024); SetNonBlock(g_listen_fd); for (int i = 0; i < cnt; i++) { ...原创 2019-03-12 20:30:38 · 500 阅读 · 0 评论 -
详谈 Libco
文章目录Linux下内存布局协程切换的原理协程栈共享栈协程的优势同步调用,异步调用和协程调用协程的Hook层钩子函数read钩子函数write钩子函数connect协程的事件注册协程的事件循环(epoll + 非阻塞)激活对应协程的方式使用Libco需要注意的地方Linux下内存布局内存布局协程切换的原理Libco协程切换的原理协程栈共享栈下文介绍,此处先介绍非共享栈。在非共享栈模式...原创 2019-09-03 21:13:39 · 648 阅读 · 0 评论