MST

星途 面试题库

面试题:Go语言中Goroutine调度机制的M:N模型简述

请简要阐述Go语言Goroutine调度采用的M:N模型,其中M和N分别代表什么,这种模型相比于1:1或N:1模型有什么优势?
19.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

M:N模型概述

在Go语言Goroutine调度的M:N模型中:

  • M 代表操作系统线程(Machine Thread),是由操作系统内核管理的线程。一个M对应一个内核线程,它负责执行Go语言运行时系统分配给它的任务。
  • N 代表Goroutine,它是Go语言提供的轻量级用户态线程。多个Goroutine可以被映射到同一个M上执行,由Go语言运行时系统的调度器负责在M上调度这些Goroutine。

相比于1:1和N:1模型的优势

  1. 1:1模型:即一个用户线程对应一个内核线程。在这种模型下,创建大量线程会消耗大量系统资源(如内核栈空间等),因为每个线程都需要内核资源支持。同时,线程切换开销较大,因为涉及到内核态上下文切换。而M:N模型中,由于多个Goroutine复用少量的M,减少了内核线程的创建数量,降低了系统资源消耗,且Goroutine之间的切换是在用户态进行,开销小。
  2. N:1模型:即多个用户线程映射到一个内核线程。这种模型在多核CPU环境下无法充分利用多核优势,因为同一时间只有一个用户线程能在CPU上执行。而M:N模型可以将多个Goroutine调度到不同的M上并行执行,充分利用多核CPU资源,提高程序的并发性能。