在学习go的过程中发现 gorountine的栈管理方式 和 传统的c/c++语言有所不同。所以本文通过整理网上资料进行学习总结。
栈的作用
首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。
注:本文中所说的栈 不是专指数据结构中的栈,而是在不同场景下利用栈这种数据结构所实现的应用。例如:进程栈,线程栈,协程栈,硬件栈,内核栈,中断栈等等。栈的大小不是实时固定的,是根据程序的运行动态变化的,但都有一个最大值,本文讨论的栈大小都是指栈的最大值。
栈作用可以从两个方面体现:函数调用 和 多任务支持 。
函数调用:
不同和语言会有不同的函数调用约定,但无论是那个一种的传参格式和栈帧清理约定,都用到栈这种数据结构。因为在函数调用过程中肯定是 调用者先开辟栈帧空间被调用者后开辟栈帧空间,被调用者肯定先于调用者执行完,所以是被调用者先回退栈帧孔空间,再回退调用者的栈帧空间。这个过程刚好是个一个 后入先出 的过程,而栈刚好满足这个特性。
函数栈帧:函数调用经常是嵌套的,在同一时刻,栈中会有多个函数的信息。每个未完成运行的函数占用一个独立的连续区域,称作栈帧(Stack Frame)。栈帧存放着函数参数,局部变量及恢复前一栈帧所需要的数据等。
多任务支持:
这个很好理解,栈中可以保存一个执行单元的上下文环境。多任务切换的时候只要把当前执行单元的环境保存在自己的栈中,当再次执行的时候从任务单元的栈中恢复这个环境就可以了。这个特性是栈可以支持的,但不一