MST

星途 面试题库

面试题:Go语言中Goroutine优化线程模型的基础原理

请简要阐述Goroutine是如何对传统线程模型进行优化的,从调度、资源消耗等方面说明。
35.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

调度方面优化

  1. M:N调度模型:传统线程模型一般是1:1调度,即一个内核线程对应一个用户线程。而Goroutine采用M:N调度模型,多个Goroutine(N个)可以复用少量的操作系统线程(M个)。这使得Go运行时系统能更灵活地调度Goroutine,比如某个Goroutine阻塞时,运行时可以将其他Goroutine调度到其他可用的M上执行,避免整个线程阻塞,提升CPU利用率。
  2. 协作式调度:Goroutine使用协作式调度,当一个Goroutine遇到阻塞操作(如I/O、系统调用等)或者主动调用runtime.Gosched()时,会主动让出CPU,以便其他Goroutine有机会执行。这种调度方式避免了抢占式调度带来的上下文切换开销,且实现简单高效。

资源消耗方面优化

  1. 轻量级:Goroutine非常轻量级,相比传统线程,创建和销毁Goroutine的开销极小。一个Goroutine初始栈空间仅2KB左右,而传统线程栈空间一般为MB级别。这使得在程序中可以轻松创建大量Goroutine,而不会像传统线程那样因栈空间占用过多导致内存耗尽。
  2. 复用资源:由于多个Goroutine复用少量操作系统线程,减少了操作系统内核线程的创建和管理开销,同时也降低了内存等资源的占用,提高了系统资源的利用率。