Go 并发编程面试题, 什么是 Go 语言的 M:N 模型?
Go 并发编程面试题, 什么是 Go 语言的 M:N 模型?
QA
Step 1
Q:: 什么是 Go 语言的 M:
N 模型?
A:: Go 语言的 M:N 模型指的是 Goroutine 与内核线程的调度模型。在这种模型中,M 个 Goroutine 由 N 个内核线程来执行,Goroutine 是 Go 语言中的轻量级线程,由 Go 语言的调度器管理,而不是直接依赖于操作系统的线程。M:
N 模型允许程序在不需要创建大量操作系统线程的情况下,实现并发处理,从而减少上下文切换的开销,提高程序性能。
Step 2
Q:: Go 语言的调度器是如何工作的?
A:: Go 语言的调度器基于 work-
stealing 算法,它会将 Goroutine 分配到不同的 P(Processor)上执行。每个 P 关联一个线程,当一个 P 上的 Goroutine 队列为空时,调度器会从其他 P 的队列中“偷取”任务以保持高效的利用率。通过这种方式,Go 语言可以实现高效的并发执行,最大限度地利用多核 CPU 的计算能力。
Step 3
Q:: 在什么情况下会遇到 Goroutine 泄漏?如何避免?
A:: Goroutine 泄漏发生在 Goroutine 启动后没有正常退出的情况,比如 Goroutine 在等待一个永远不会发送数据的通道。为了避免 Goroutine 泄漏,应该确保每个 Goroutine 在完成其任务后能够正常退出,例如在 Goroutine 中引入超时机制或使用 context 控制 Goroutine 的生命周期。
Step 4
Q:: Go 语言中的 channel 是如何实现线程安全的?
A:: Go 语言的 channel 是线程安全的,因为它们在底层使用了互斥锁(mutex)来控制对共享资源的访问。当一个 Goroutine 向 channel 发送数据或从 channel 接收数据时,其他 Goroutine 会被阻塞直到操作完成,这样可以避免数据竞争,从而保证线程安全。