面试题答案
一键面试调度方面优化
- M:N调度模型:传统线程模型一般是1:1调度,即一个内核线程对应一个用户线程。而Goroutine采用M:N调度模型,多个Goroutine(N个)可以复用少量的操作系统线程(M个)。这使得Go运行时系统能更灵活地调度Goroutine,比如某个Goroutine阻塞时,运行时可以将其他Goroutine调度到其他可用的M上执行,避免整个线程阻塞,提升CPU利用率。
- 协作式调度:Goroutine使用协作式调度,当一个Goroutine遇到阻塞操作(如I/O、系统调用等)或者主动调用
runtime.Gosched()
时,会主动让出CPU,以便其他Goroutine有机会执行。这种调度方式避免了抢占式调度带来的上下文切换开销,且实现简单高效。
资源消耗方面优化
- 轻量级:Goroutine非常轻量级,相比传统线程,创建和销毁Goroutine的开销极小。一个Goroutine初始栈空间仅2KB左右,而传统线程栈空间一般为MB级别。这使得在程序中可以轻松创建大量Goroutine,而不会像传统线程那样因栈空间占用过多导致内存耗尽。
- 复用资源:由于多个Goroutine复用少量操作系统线程,减少了操作系统内核线程的创建和管理开销,同时也降低了内存等资源的占用,提高了系统资源的利用率。