概述

线程是操作系统最小的调度单元,它们在不同的操作系统上实现不同,大多数实现中线程属于进程。多线程可以属于同一个进程并共享内存空间,所以也不需要内存管理单元管理上下文切换,线程之间的通信也是基于共享内存实现的。

虽然线程轻量,但是在调度时还是会有比较大的额外开销,每个线程占有大于 1MB 的内存空间,切换线程时不仅会有较大的内存消耗,恢复寄存器中的内容还要向操作系统申请。

go 的调度器使用与 CPU 数量一样的线程数来减少线程频繁切换带来的内存开销,同时在每一个线程上执行额外开销更低的 goroutine 来降低操作系统和硬件的负载。image.png

数据结构

image.png
● G 表示 goroutine,指待执行的任务。

● M 是操作系统的线程,由操作系统的调度器调度和管理。

● P 表示处理器,可以把它看做在线程上运行的本地调度器。