理解有栈无栈协程
可能会有错误, 只是自己简单的理解
之前一直没想明白了一个问题, 就是关于协程如何进行上下文切换.
众所周知, 协程是分为有栈协程和无栈协程俩种. 区别在于是否有自己的调用栈来进行函数调用等操作.
有栈协程
有栈协程这里的做法比较好理解, 一般来说有俩种做法:
- 采用操作系统提供的api 类似 ucontext 或者 setjump longjump
- 用汇编操控寄存器保存状态 典型的例子
static
( 来源同班大佬同学 @蟑螂恶霸
的代码 https://github.com/cyyzero/coroutine/blob/master/src/coroutine.c)
这样每个协程切换的时候, 整个栈都会被切换, 看起来和线程没啥区别, 只是调度一个发生在用户态可以由用户控制, 一个发生在内核态由系统控制.
无栈协程
有栈协程的做法比较好理解, 那无栈线程是怎么做的呢?无栈协程是怎么利用vm自带的栈完成上下文切换? 他的状态报存在哪里呢?
首先, 先说结论, 无栈协程的实现, 要几个条件: 1. 栈帧内保存的不是状态而是指向状态的指针. 2. 所有帧的状态保存在堆上
为什么说第二点比较重要, 因为理解了第二点, 就发现, 其实根本不需要上下文切换,