Go 并发编程面试题, 哪些操作会触发 Go 语言中的 runtime 调度?
Go 并发编程面试题, 哪些操作会触发 Go 语言中的 runtime 调度?
QA
Step 1
Q:: 什么是 Go 语言中的 runtime 调度?
A:: Go 语言中的 runtime 调度是 Go 运行时用来管理 Goroutine 执行的机制。它通过将 Goroutine 映射到操作系统线程上,实现多任务的并发执行。调度器通过工作窃取算法、抢占式调度等手段,确保 Goroutine 高效执行,并在 I/
O 阻塞、系统调用等场景下,重新分配线程执行其他 Goroutine。
Step 2
Q:: 哪些操作会触发 Go 语言中的 runtime 调度?
A:: 以下操作可能会触发 Go 语言中的 runtime 调度:1) Goroutine 阻塞,如等待 I/O 操作完成;2) Goroutine 进入休眠状态,如调用 time.Sleep;3) 系统调用,例如通过 syscalls 与操作系统交互;4) 主动让出 CPU,如调用 runtime.Gosched;5)
当垃圾回收(GC)运行时,可能会暂停 Goroutine 以进行内存清理。
Step 3
Q:: Goroutine 和线程的区别是什么?
A:: Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理。与操作系统线程相比,Goroutine 的启动和销毁代价更低,占用的内存更少。Goroutine 通过 M(操作系统线程)和 P(逻辑处理器)映射到实际的 CPU 核心上进行调度,而操作系统线程由操作系统调度管理。
Step 4
Q:: Go 中的抢占式调度是什么?
A:: Go 语言中的抢占式调度是一种调度机制,它允许 Go 运行时在 Goroutine 长时间占用 CPU 时,强制其让出 CPU 给其他 Goroutine。这是为了防止某个 Goroutine 独占资源,导致其他 Goroutine 得不到执行机会。抢占式调度通常在函数调用时检查,并可能在垃圾回收等场景下触发。