Skip to content

golang 线程调度——实现机制

众所周知,在多核 CPU 遍地开花、众核攻城略地的今天,并发的程序设计模式已经是显学。关于线程调度的文章也数不胜数,但大部分这样的文章都只停留在策略层面上,如轮转、彩票;很少有文章介绍背后的机制(mechanism)。这一方面再次说明了操作系统设计中常说的“策略与机制分离”的有效性,使得我们可以完全不谈论调度的实现机制而理解调度的行为,但另一方面则让调度机制蒙上了一层神秘的面纱。在这篇文章之中我将会把这层面纱揭开,向大家充分介绍线程调度的实现机制。

我们常说,进程是资源分配的最小单位,线程是调度的最小单位。这句话的意思是,操作系统以进程为单位分配内存资源、文件描述符资源,但 CPU 的调度则是以线程为单位进行的。一个进程在创建时就会伴随产生一个初始线程,然后以线程的身份被调度到一个空闲的 CPU 上执行。

我们常说的并行(paralellism)和并发(concurrency)的区别在于,并发强调的是一个时间段内有多个线程被执行,而并行则说的是同一时刻有多个线程在同时执行。并行一定有并发,而并发则不一定有并行。

通过进程来实现并发是一件较为痛苦的事情。进程间通讯、变量共享都比较困难。

进程上下文切换和线程上下文切换。

goroutine 的调度是通过 go runtime 来管理的。绿色协程。