gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:25:22 24 4
gpt4 key购买 nike

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

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

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

最佳答案

协程、内存和操作系统线程

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

协程切换成本

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

协程和 CPU

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

程序计数器

一个完全不同的故事

在计算中,程序是计算机执行的一组特定的有序操作。指令是程序向计算机处理器发出的命令。在计算机中,地址是内存或存储中的特定位置。程序计数器寄存器是处理器使用的一小组数据保存位置之一。

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

来源:

关于multithreading - 当 Goroutines 切换时,CPU 上下文会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com