有栈协程和无栈协程之前面试的时候面试官问我这个问题。我说好像他们都有运行时候的栈,所以我不懂有什么区别。面试官说他们的区别主要是调用者是否需要考虑栈的大小。后来我回来理解了一下,的确有栈(ucontext这种)和无栈实际都会有 context 和 registers 、pc 指针保存,但是作用域不一样。这里一张图说明一下:
有栈就是 ucontext 以及 xv 6 里面写的那个 user level thread (no multicore),可以直接挂起一系列的帧。
无栈就是编译器在 await 里面用钩子来执行状态机代码,所有都需要人工编写显式的挂起恢复。