小编典典

Goroutines切换时,CPU上下文会发生什么?

go

如果我正确理解goroutine在系统线程之上的工作方式,那么它们将从队列中逐一运行。但这是否意味着每个goroutine都会将其上下文加载/卸载到CPU?如果是,系统线程和goroutines之间有什么区别?

最重要的问题是上下文切换的时间成本。这是正确的吗?

检测哪种goroutine请求哪些数据的基础是什么?例如:我正在从goroutine
A向DB发送请求,并且不等待响应,并且同时切换到下一个goroutine。系统如何理解请求来自A而不是来自B或C?


阅读 349

收藏
2020-07-02

共1个答案

小编典典

Goroutine,内存和OS线程

Go具有可根据需要增长的分段堆栈。运行时执行调度,而不是操作系统。运行时将goroutine复用到相对较少的实际OS线程上。

Goroutines切换成本

Goroutine是协同调度的,当发生切换时,仅需要保存/恢复3个寄存器-
程序计数器,堆栈指针和DX。从操作系统的角度来看,Go程序的行为就像一个事件驱动程序。

Goroutine和CPU

您不能直接控制运行时将创建的线程数。可以通过调用来设置变量GOMAXPROCS来设置程序使用的处理器内核数量runtime.GOMAXPROCS(n)

程序计数器

和一个完全不同的故事

在计算中,程序是计算机要执行的一组特定的有序操作。指令是由程序赋予计算机处理器的命令。在计算机内,地址是内存或存储中的特定位置。程序计数器寄存器是处理器使用的一小部分数据存放位置之一。

这是关于程序如何工作以及如何相互通信的另一个故事,它与goroutine主题没有直接关系。

资料来源:

2020-07-02