2010-06-17 43 views
0

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

+1

调度程序是多核知道是itself.You可能想看看这个单独的话题:HTTP://software.intel。 com/sites/oss/pdfs/mclinux.pdf 在编程人员的层面上,您必须开发算法,使得不相互依赖的部分可以并行运行(线程)。快速傅立叶变换是并行计算的完美示例。有多个并行库可用于多核编程。 – itisravi 2010-06-18 06:48:54

+0

虽然我没有得到确切的答案,但它是一个非常好的链接。 – 2010-06-22 20:08:18

回答

1

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

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

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

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

0

在Linux中,你可以使用taskset -C### ./executable其中####是CPU列表