如果我正确理解goroutine在系统线程之上的工作方式,那么它们将从队列中一个接一个地运行。但这是否意味着每个goroutine都会将其上下文加载/卸载到CPU?如果是,系统线程和goroutines之间有什么区别?
最重要的问题是上下文切换的时间成本。这是正确的吗?
检测哪种goroutine请求哪些数据的基础是什么?例如:我正在从goroutine A向DB发送请求,并且不等待响应,并且同时切换到下一个goroutine。系统如何理解请求来自A而不是来自B或C?
最佳答案
Goroutine,内存和OS线程
Go具有可根据需要增长的分段堆栈。 Go运行时执行调度,而不是操作系统。运行时将goroutine复用到相对较少的实际OS线程上。
Goroutines切换成本
Goroutine是协同调度的,并且在发生切换时,仅需要保存/恢复3个寄存器-程序计数器,堆栈指针和DX。从操作系统的角度来看,Go程序的行为就像一个事件驱动程序。
Goroutine和CPU
您无法直接控制运行时将创建的线程数。通过调用runtime.GOMAXPROCS(n)
设置变量GOMAXPROCS,可以设置程序使用的处理器内核数量。
程序计数器
和一个完全不同的故事
在计算中,程序是计算机要执行的一组特定的有序操作。指令是由程序赋予计算机处理器的命令。在计算机内,地址是内存或存储中的特定位置。程序计数器寄存器是处理器使用的一小部分数据保存位置中的一个。
这是关于程序如何工作以及如何相互通信的另一个故事,它与goroutine主题没有直接关系。
资料来源:
关于multithreading - 当Goroutine切换时,CPU上下文会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41045362/