在多核处理器中,有一些方法可以告诉特定应用程序在单核或2核或3核中运行。考虑到应用程序(具有批次线程)在多个核心上运行的情况,调度程序如何能够确定多核处理器中特定核心的负载(线程数)并相应地分配(平衡)在各个核心上加载(分配线程)?
答案 0 :(得分:1)
在大多数调度程序中,每个CPU都是一个独立的实体,它检查系统的当前状态并尝试查找有用的内容。将CPU描绘成一个工作狂 - 它总是会尝试做任何事情。调度程序不是“老板”,它告诉CPU下一步该做什么,确保每个人都做得很公平。相反,每个CPU都遵循一种调度算法,在该算法中,它将检查系统的状态,并尝试找出如何做最多的工作。
调度算法可能具有一些“线程亲和性”的规定,这意味着CPU将更喜欢运行先前调度的线程,因为该线程更可能在缓存中。然而,与网络负载平衡不同,调度算法通常(但并非总是)与尽可能保持每个CPU忙碌有关,即使工作负载最终不公平。
为什么呢?如果工作负载是CPU密集型的,那么每个CPU将能够以接近100%的速度运行,并且工作负载将是公平的。如果工作负载是I / O密集型的,并且CPU花费大部分时间等待共享资源变得可用,这是现实世界系统的正常情况,那么任何负载平衡策略都可能与简单地将共享资源释放为尽快。
一个简单的多CPU调度程序将包括一个可运行线程队列和一个被阻塞线程列表 - 这个队列和列表是所有CPU共享的数据结构,访问受锁定保护。当CPU进入调度程序时,它将选择优先级最高的可运行线程,并运行该线程,直到块或分配的时间片到期为止。如果线程阻塞,则将其置于被阻塞线程列表中,直到它再次运行。如果时间片到期,则将线程置于可运行线程队列中的延迟位置,并选择另一个线程。
答案 1 :(得分:0)
在Linux中,您可以使用taskset -c ### ./executable
,其中####是cpu列表