区分 Goroutines、用户线程和内核线程
简介
goroutine 的概念在探索时,用户线程和内核线程可能会令人困惑Go 的并发模型的复杂性。本文旨在阐明这些概念并解决相关问题。
问题 1:定义操作系统线程和 Goroutines
问题:
- 《Effective Go》介绍中提到了 goroutine。 “操作系统线程”指的是什么?是用户线程还是内核线程?
答案:
问题2:理解Go中的P和G调度器
问题:
- 为什么P(处理器/调度上下文)的数量等于CPU核心的数量?
- 如果所有 CPU 都在为 Go 程序提供服务,那么操作系统中需要 CPU 的其他程序会发生什么情况分配?
答案:
- P 作为 goroutine 和内核线程之间的映射层。每个内核线程有一个 P。
- Go 程序默认可以分配所有可用的 CPU 核心(GOMAXPROCS),但这并不妨碍其他操作系统进程的执行。即使并发操作,进程也会花费大量时间等待 I/O 操作,从而允许内核调度程序将 CPU 时间分配给其他程序。
问题 3:内核线程数生成
问题:
答案:
- 号码操作系统创建的内核线程的数量是动态的,取决于系统负载。
以上是Goroutines、用户线程和内核线程:有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!