3 回答
TA贡献1828条经验 获得超4个赞
goroutine 与典型的 OS 线程的区别有以下几点:
有用户模式调度。当一个 goroutine 被阻塞(比如在网络上等待)时,Go 运行时会寻找另一个可以运行的 goroutine。这不需要进入和退出内核模式,也不需要操作系统内核的调度程序运行。
没有唯一的用户模式调度:使用多个内核,Go会启动多个操作系统线程和运行够程上所有的人,潜在的移动操作系统线程之间的goroutine把一切都很忙。如果你听说 goroutines 被“多路复用”到操作系统线程上,那就是它的意思。
它们的开始成本很低。堆栈开始很小,只有几千字节,并根据需要增长,无论操作系统是否使用虚拟内存过量使用。
它们缺乏一些操作系统线程功能:目前,Go 的调度程序不能保证公平性,并且只有非常有限的抢占(
for{}
永远不会切换空循环)。
它们与许多其他术语密切相关:
纤维,一个与用户模式调度线程相关的术语
绿色线程,另一个用于指代用户模式调度线程的术语
协程,指的是可以在其代码中的任意点相互让出控制权的例程
事件驱动架构,它可能会在等待网络 I/O 等异步事件时切换到其他任务,但可能不会呈现类似线程的接口(例如,它们可能会使用回调函数)
M:N 混合线程,涉及内核和用户模式线程,并且可能涉及跨操作系统线程的用户模式线程迁移。
TA贡献1860条经验 获得超8个赞
当有两个 CPU 时,goroutine(s) 作为真正的线程运行。当具有单个 CPU 时,goroutine 作为单线程的协程运行,这些线程在切换上下文时运行。goroutine 不会粘住固定线程。所以它不像线程ID那样标识符。如果你想把 goroutine 作为 OS 线程,你需要使用runtime.LockOSThread()
.
TA贡献1995条经验 获得超2个赞
Morsing 的这篇关于 Go 调度器的博客文章很好,因为它有三角形、正方形和圆形的图片。
从调度程序的角度来看:
goroutine 包括堆栈、指令指针和其他对调度很重要的信息。
- 3 回答
- 0 关注
- 206 浏览
添加回答
举报