求剧情
Go语言学习笔记 · 第十五节

《Go语言学习笔记》第十五节

本节先讲连续栈的扩容与回收:编译器在函数头部插入指令,比较SP与stackguard0判断是否溢出,必要时分配两倍大小的新栈并拷贝数据替换旧栈;回收的栈放回复用链表……

本节先讲连续栈的扩容与回收:编译器在函数头部插入指令,比较SP与stackguard0判断是否溢出,必要时分配两倍大小的新栈并拷贝数据替换旧栈;回收的栈放回复用链表,缓存过多则归还heap。垃圾回收、procresize、gfput等操作也会触发栈释放,shrinkstack还会收缩已扩容的栈。

接着讲系统调用与抢占调度:Syscall相比RawSyscall多了enter/exitsyscall,允许长时间阻塞时交出P由sysmon抢回;返回时需检查P是否仍可用,绑定失败则任务入队。Go的抢占调度没有时间片,只在G上设抢占标志,由morestack扩容前检查并暂停任务。随后介绍了几种暂停操作:Gosched暂停并放回全局队列,gopark暂停但须主动恢复,notesleep直接让线程休眠,Goexit终止G并执行defer。最后说明STW通过设置gcwaiting和抢占标志让G在安全点主动暂停,startTheWorld则唤醒P/M恢复执行。

末尾引入channel:它是CSP模型的关键,同步与异步的区别在于是否有缓冲槽,收发双方需包装以携带数据,channel还维护等待队列与缓冲槽索引。

‹ 上一章目录下一章 ›

全部 17 章