Linux支持具有多个处理器的单一系统。引导过程除外,支持多个处理器的大量工作由进程调度程序负责。在对称多重处理(SMP)及其上,进程调度程序必须决定每个CPU上要运行哪些进程。有两项挑战源自此责任:调度程序必须想办法充分利用系统上的所有处理器,因为当有一个进程已就绪等待运行,却有一个CPU闲置一旁,这显然没有效率。
然而一个进程一旦被安排在某个CPU上运行,往后进程调度程序也会将它安排在相同的CPU上运行。这是有益的,因为将一个进程从一个处理器迁移到另一个处理器是要付出代价的。
这些代价中最大者与“迁移的缓存区效应”(cache effect)有关。由于现在SMP系统的设计,与每个处理器相关的缓存区是不同且独立的。也就是说,如果数据位于一个处理器的缓存区中,就不会位于另一个处理器的缓存区中。因此,如果一个进程被迁移往一个新的CPU,而且将新的数据写入内存,那么位于旧CPU缓存区中的数据就过时了。现在若使用该缓存区,则会导致数据被破坏。为了避免此现象,当一个缓存区中缓存了一个新的内存块时,这会让其他每个缓存区中的数据失效。因此任何时刻特定的一段数据只能出现在一个处理器的缓存区中(假设数据全部被缓存起来)。当有一个进程从一个处理器移往另一个处理器时会付出两种代价:被移动的进程无法访问被缓存起来的数据,而且位于原处理器缓存区的数据必须作废。因为必须付出这些代价,所以进程调度程序会尽可能为一个进程安排特定的CPU来运行它。
当然,进程调度程序的两项目标可能无法实现。如果一个处理器的进程负荷比另一个处理器大很多(或者,更糟糕的是,如果一个处理器处于忙碌状态,而另一个处理器却闲置一旁),明智的做法是对一些进程重新调度,让它们在比较不忙的CPU上运行。决定何时移动进程以响应此类不平衡的状态称为负载均衡(loa