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