面试题答案
一键面试- 调度方面:
- 轻量级调度:Goroutine非常轻量级,创建和销毁开销极小。相比传统线程,一个程序可轻松创建成千上万的Goroutine,而创建大量传统线程会消耗大量系统资源且导致性能问题。
- 协作式调度:Goroutine采用协作式调度(M:N调度模型),由Go运行时(runtime)的调度器管理。多个Goroutine可复用少量操作系统线程(M),当一个Goroutine阻塞(如进行I/O操作)时,调度器能将其他可运行的Goroutine调度到线程上执行,避免线程阻塞浪费资源,提高CPU利用率。而传统线程模型多为一对一(1:1)调度,线程阻塞会导致对应的内核线程阻塞,降低效率。
- 调度策略:调度器使用工作窃取算法(work - stealing),当某个线程的本地Goroutine队列空了,它可以从其他线程的队列中窃取Goroutine来执行,负载均衡效果好,充分利用多核CPU资源。
- 资源占用方面:
- 内存占用少:Goroutine初始栈空间小,一般只有2KB左右,相比传统线程栈的数MB,大大节省内存。并且Goroutine栈可根据需要动态增长和收缩,进一步优化内存使用。
- 系统资源开销小:由于Goroutine复用操作系统线程,减少了操作系统内核线程数量,降低了内核态与用户态切换带来的开销,也减少了内核资源(如内核栈、线程控制块等)的占用。