Linux CPU隔离和互斥锁

时间:2019-01-28 15:28:46

标签: c linux linux-kernel scheduler

我目前正在研究使用isolcpus的选项,以便隔离某些内核并将其专用于具有某些实时约束的进程。 在isolcpus的文档中查找,指出了

  

说明从常规内核SMP平衡和调度程序算法中删除cpu_number值定义的指定CPU。

我的进程有4个线程,我隔离了2个内核(忽略HT),它们需要使用某种Linux OS同步原语(互斥体,信号量,cond var等)进行同步。如果如文档所述将内核从调度算法中删除,并且其中一个线程阻塞并进入睡眠状态,那么当线程解除阻塞时,谁将线程调度回隔离的CPU?

谢谢。

1 个答案:

答案 0 :(得分:3)

CPU被“从常规内核SMP平衡和调度程序算法中删除[d ...]”意味着内核将不会选择那些(逻辑)CPU来调度常规任务,从而有效地表示尚未通过诸如tasksetcset命令之类的CPU被明确分配给CPU的亲和力。还可以得出结论,在一个或多个CPU上计划的任务将仅在分配的CPU上运行,甚至在隔离集中的其他CPU上也不会运行(如果有的话),而不管相对CPU负载如何。

但是,这并不意味着内核放弃了调度明确分配给隔离CPU的任务的责任。它像安排其他任何任务一样对它们进行调度,但是仅在为其分配了亲和力的CPU上进行调度。您无需为分配给隔离CPU的任务安排特殊的调度。

顺便说一句,

  

我隔离了2个核心(忽略HT)

,我怀疑您可能有误解。 Linux实际上将启用了超线程的内核作为两个独立的内核进行处理,尽管实际上它们共享处理资源。因此,如果启用了HT,则无法安全地忽略它。实际上,至少在选择要隔离的核心数量时,您实际上需要非常仔细地加以考虑。