在SMP系统上,为了充分利用拥有多个处理器的优点,保持所有处理器之间的工作负载均衡是很重要的。当某些处理器处于高工作负载,且还有一些列进程在等待该CPU的资源的情况下,那么很可能有的处理器正处于闲置状态。负载均衡就是设法将工作负载平均的分配给SMP系统中的所有处理器上。

注意的是,负载均衡值对于拥有自己私有的可执行进程的处理器而言是必要的。在共有进程队列的系统上,通常不需要负载均衡,因为一旦一个CPU空闲,那么它可以去公共的运行队列中获取进程来运行。

还需要注意的是,在支持SMP的大多数现代操作系统中,每个处理器都有一个符合条件的进程的私有队列。

负载均衡有两种通用的方法:

  • push migration:使用push移动的话,就会有一个特定的任务,它会周期的检查每个处理器上的负载---------如果它发现不平衡了----------通过移动(或推送)进程从过载到空闲或不繁忙的处理器上,实现平均分配负载。
  • pull migration:而pull移动则发生在一个闲置的处理器从其他繁忙的处理器上拉取进程。

Push和pull迁移不需要互斥,实际上经常在负载平衡系统上并行实现。例如,Linux调度器(在6.7.1节中描述)和用于FreeBSD系统的ULE调度器都实现了这两种技术。

有趣的是,负载平衡经常抵消处理器亲和性(在6.5.2节中讨论过)的好处。也就是说,让进程在同一处理器上运行的好处是,进程可以利用它在处理器缓存中的数据。将进程从一个处理器拖拽到另一个处理器,可以消除这个好处。正如在系统工程中经常出现的情况一样,对于什么是最好的策略并没有绝对的规则。因此,在某些系统中,空闲处理器总是从非空闲处理器中提取进程。在其他系统中,只有当这个不平衡超过某个阈值时,进程才会被移动。

results matching ""

    No results matching ""