Go语言学习笔记 · 第十四节
《Go语言学习笔记》第十四节
本节讲解Go运行时中M(系统线程)的创建、调度与栈管理。
本节讲解Go运行时中M(系统线程)的创建、调度与栈管理。
M创建时自带g0对象作为默认栈,运行时管理指令切换到g0栈执行,与用户G栈隔离。M数量有上限(默认1万),闲置M不回收,过多会造成浪费。M通过mstart或休眠唤醒进入调度循环:绑定P后,由schedule获取G,经execute交给gogo汇编函数切换到G栈执行。G栈顶预先压入goexit地址,任务结束后RET回到goexit,再进入下一轮调度。
查找可运行G时按优先级依次查P本地队列(runnext最高)、全局队列(批量转移)、其他P队列(偷窃)。cgo调用可锁定G在当前线程,需传递P并休眠唤醒配合。栈采用连续栈方案,不足时按2倍扩容拷贝,由stackguard0触发;栈空间按大小分级缓存复用。