goroutine和线程的区别
谈到 goroutine,绕不开的一个话题是:它和 thread 有什么区别?
446 字
|
2 分钟
GPM 是什么
G、P、M 是 Go 调度器的三个核心组件,各司其职。在它们精密地配合下,Go 调度器得以高效运转,这也是 Go 天然支持高并发的内在动力。今天这篇文章我们来深入理解 GPM 模型。
1008 字
|
5 分钟
参考资料
在 schedule 函数中,我们简单提过找一个 runnable goroutine 的过程,这一讲我们来详细分析源码。
2950 字
|
15 分钟
参考资料
上一讲我们讲完了 Go scheduler 的初始化,现在调度器一切就绪,就差被调度的实体了。本文就来讲述 main goroutine 是如何诞生,并且被调度的。
1058 字
|
5 分钟
参考资料
上一讲新创建了一个 goroutine,设置好了 sched 成员的 sp 和 pc 字段,并且将其添加到了 p0 的本地可运行队列,坐等调度器的调度。
1008 字
|
5 分钟
参考资料
上一节,我们讲完 main goroutine 以及普通 goroutine 的退出过程。main goroutine 退出后直接调用 exit(0) 使得整个进程退出,而普通 goroutine 退出后,则进行了一系列的调用,最终又切到 g0 栈,执行 schedule 函数。
873 字
|
4 分钟
抢占进行系统调用的 P
在 runtime.main() 函数中,执行 runtimeinit() 前,会启动一个 sysmon 的监控线程,执行后台监控任务:
2840 字
|
14 分钟
一个调度相关的陷阱
由于 Go 语言是协作式的调度,不会像线程那样,在时间片用完后,由 CPU 中断任务强行将其调度走。对于 Go 语言中运行时间过长的 goroutine,Go scheduler 有一个后台线程在持续监控,一旦发现 goroutine 运行超过 10 ms,会设置 goroutine 的“抢占标志位
521 字
|
3 分钟