从Go源代码看goroutine的切换
2024-08-15 00:15:37
  • CPU的指令包括特权级指令和非特权级指令。

  • 协程的切换也涉及到CPU寄存器的保存,但是这些寄存器的保存操作按理来说就应该是非特权级指令的。不然不可能只在用户态就完成了。

  • 而之所以仅需要非特权级指令就能完成这些保存,是因为部分特权级较高的寄存器的操作没涉及到,那些东西是线程层面的东西,所以涉及不到。这也就是所谓的轻量的地方。

  • 换言之,并不是所有涉及CPU寄存器修改的指令都是特权级指令。

  • 协程是在线程的用户态栈区内部分化的栈区,所以,按照我的理解,协程的切换不涉及CS,SS,DS这些的吧。
    IP值的修改不知道是不是通过执行流程啥的改变,或者别的。所以,按照我这个理解,就顺畅起来了。

    在 Go 语言中,协程切换时通常不会直接修改 CS(代码段寄存器)、SS(栈段寄存器)、DS(数据段寄存器)这些寄存器的值。

这是因为 Go 语言的协程实现是基于其自身的运行时系统和调度机制。Go 语言的协程切换更侧重于对协程上下文的管理和切换,而非直接操作底层的硬件寄存器。
例如,当一个协程被暂停并切换到另一个协程时,Go 运行时会保存当前协程的相关状态信息,如栈指针、程序计数器等,以便在后续恢复执行时能够准确回到暂停的位置继续执行。
这种机制使得 Go 语言的协程能够在高效执行的同时,提供了简洁易用的并发编程模型,开发者无需过多关注底层硬件寄存器的细节。
——————————来自于豆包。

Prev
2024-08-15 00:15:37
Next