MST

星途 面试题库

面试题:Go中Goroutine调度机制的基本原理是什么

请简要阐述Go语言中Goroutine调度机制的M:N模型,包括M、N分别代表什么,以及调度器如何在这种模型下工作。
33.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. M、N代表的含义
    • M:代表操作系统线程(Machine)。一个M就是一个真实的操作系统线程,它负责执行Go语言运行时系统调度给它的任务。M在Go语言运行时系统中有自己的栈空间,并且可以在操作系统内核中进行调度。
    • N:代表Goroutine(Number of goroutines)。Goroutine是Go语言中轻量级的用户态线程,由Go语言运行时系统自己管理。N个Goroutine可以被调度到M个操作系统线程上运行。
  2. 调度器在M:N模型下的工作方式
    • Goroutine创建与管理:当Go程序创建一个新的Goroutine时,这个Goroutine并不会立即被映射到一个操作系统线程上运行。而是被放入到Go运行时系统的全局Goroutine队列或者某个本地Goroutine队列(每个M都有一个本地队列)中。
    • 调度器选择Goroutine:调度器会从全局队列或者本地队列中选择一个Goroutine来执行。当一个M线程被调度到CPU上运行时,它会从自己的本地Goroutine队列中取出Goroutine来执行。如果本地队列为空,它会尝试从全局队列中窃取一些Goroutine(这就是工作窃取算法),以充分利用CPU资源。
    • 上下文切换:当一个Goroutine执行系统调用(如I/O操作)时,为了避免阻塞整个操作系统线程,Go运行时系统会将这个Goroutine与当前的M分离,让M去执行其他的Goroutine,而这个发起系统调用的Goroutine会被阻塞,直到系统调用完成。当系统调用完成后,这个Goroutine会被重新放入队列,等待调度器再次调度到某个M上运行。此外,Go运行时系统还会在Goroutine执行一段时间后(通过时间片机制),将其暂停,把执行权交给其他Goroutine,从而实现多个Goroutine的并发执行。