Skip to main content

MPG

David LiuLess than 1 minute

MPG

在操作系统提供的内核线程之上,Go 搭建了一个特有的用户级线程模型。传统的函数调用是将函数指针存储在内存的栈空间上,但是栈空间只允许操作系统进行操作,我们能拿到的只限于堆内存,所以 Go 开发者在堆上申请一块内存,将寄存器 %rsp 以及寄存器 %rbp 指过去,从而将这块内存伪装成用户栈,从而巧妙地实现了并行运行用户级线程 goroutine。要聊 Go 的线程实现模型,必须要知道以下 3 个核心元素:

  • M:machine 缩写,一个 M 代表一个内核线程。
  • P:processer 缩写,一个 P 代表执行一个 Go 代码片段所需的必要资源。
  • G:goroutine 缩写,一个 G 代表一个 Go 代码片段。