0

在多核处理器中,有多种方法可以告诉特定应用程序以单核或 2 核或 3 核运行。考虑到应用程序(具有大量线程)在多个内核上运行的场景,调度程序如何能够确定多核处理器中特定内核上的负载(线程数)并相应地分配(平衡)跨各个内核加载(分配线程)?

4

2 回答 2

1

在大多数调度程序中,每个 CPU 都是一个独立的实体,它检查系统的当前状态并尝试找到有用的事情来做。将 CPU 想象成一个工作狂——它总是会尝试任何可以做的事情。调度程序不是告诉 CPU 下一步做什么的“老板”,确保每个人都公平分享。相反,每个 CPU 都遵循一种调度算法,在该算法中它将检查系统的状态并尝试找出如何尽可能多地完成工作。

调度算法可能对“线程亲和性”有一些规定,这意味着 CPU 将更喜欢运行先前调度的线程,因为该线程更有可能在缓存中。然而,与网络负载平衡完全不同的是,调度算法通常(但不总是)关注让每个 CPU 尽可能忙碌,即使工作负载最终是不公平的。

为什么?如果工作负载是 CPU 密集型的,那么每个 CPU 将能够以接近 100% 的速度运行,并且工作负载将是公平的。如果工作负载是 I/O 密集型的,并且 CPU 大部分时间都在等待共享资源可用,这是现实世界系统的正常情况,那么任何负载平衡策略都可能与简单地将共享资源释放为尽快。

一个简单的多 CPU 调度程序将包括一个可运行线程队列和一个阻塞线程列表——这个队列和列表是所有 CPU 共享的数据结构,访问受锁定保护。当 CPU 进入调度器时,它将选择最高优先级的可运行线程,并运行该线程,直到块或分配的时间片到期。如果线程阻塞,它将被放置在阻塞线程列表中,直到它再次变为可运行。如果时间片到期,则线程被放置在可运行线程队列中的延迟位置,并选择另一个线程。

于 2010-06-20T08:51:17.677 回答
0

在 Linux 中,您可以使用taskset -c ### ./executablewhere #### is a cpu list

于 2010-10-04T21:21:12.450 回答