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