Golang系列 - gorountine栈管理

本文探讨了Golang中goroutine的栈管理,与传统栈管理的不同之处。 Goroutine的栈大小在初始化时为2KB,按需动态调整。在栈溢出时,Go runtime使用continuous stack技术,通过检测和morestack函数处理栈扩展。文中还分析了栈溢出检测的汇编代码和newstack的工作原理。
摘要由CSDN通过智能技术生成

在学习go的过程中发现 gorountine的栈管理方式 和 传统的c/c++语言有所不同。所以本文通过整理网上资料进行学习总结。

 

栈的作用

 

首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。

 

:本文中所说的栈 不是专指数据结构中的栈,而是在不同场景下利用栈这种数据结构所实现的应用。例如:进程栈,线程栈,协程栈,硬件栈,内核栈,中断栈等等。栈的大小不是实时固定的,是根据程序的运行动态变化的,但都有一个最大值,本文讨论的栈大小都是指栈的最大值。

 

栈作用可以从两个方面体现:函数调用 和 多任务支持 。

 

函数调用:

不同和语言会有不同的函数调用约定,但无论是那个一种的传参格式和栈帧清理约定,都用到栈这种数据结构。因为在函数调用过程中肯定是 调用者先开辟栈帧空间被调用者后开辟栈帧空间,被调用者肯定先于调用者执行完,所以是被调用者先回退栈帧孔空间,再回退调用者的栈帧空间。这个过程刚好是个一个 后入先出 的过程,而栈刚好满足这个特性。

函数栈帧:函数调用经常是嵌套的,在同一时刻,栈中会有多个函数的信息。每个未完成运行的函数占用一个独立的连续区域,称作栈帧(Stack Frame)。栈帧存放着函数参数,局部变量及恢复前一栈帧所需要的数据等。

 

多任务支持:

这个很好理解,栈中可以保存一个执行单元的上下文环境。多任务切换的时候只要把当前执行单元的环境保存在自己的栈中,当再次执行的时候从任务单元的栈中恢复这个环境就可以了。这个特性是栈可以支持的,但不一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值