我目前正在研究使用isolcpus的选项,以便隔离某些内核并将其专用于具有某些实时约束的进程。 在isolcpus的文档中查找,指出了
说明从常规内核SMP平衡和调度程序算法中删除cpu_number值定义的指定CPU。
我的进程有4个线程,我隔离了2个内核(忽略HT),它们需要使用某种Linux OS同步原语(互斥体,信号量,cond var等)进行同步。如果如文档所述将内核从调度算法中删除,并且其中一个线程阻塞并进入睡眠状态,那么当线程解除阻塞时,谁将线程调度回隔离的CPU?
谢谢。
答案 0 :(得分:3)
CPU被“从常规内核SMP平衡和调度程序算法中删除[d ...]”意味着内核将不会选择那些(逻辑)CPU来调度常规任务,从而有效地表示尚未通过诸如taskset
或cset
命令之类的CPU被明确分配给CPU的亲和力。还可以得出结论,在一个或多个CPU上计划的任务将仅在分配的CPU上运行,甚至在隔离集中的其他CPU上也不会运行(如果有的话),而不管相对CPU负载如何。
但是,这并不意味着内核放弃了调度明确分配给隔离CPU的任务的责任。它像安排其他任何任务一样对它们进行调度,但是仅在为其分配了亲和力的CPU上进行调度。您无需为分配给隔离CPU的任务安排特殊的调度。
顺便说一句,
我隔离了2个核心(忽略HT)
,我怀疑您可能有误解。 Linux实际上将启用了超线程的内核作为两个独立的内核进行处理,尽管实际上它们共享处理资源。因此,如果启用了HT,则无法安全地忽略它。实际上,至少在选择要隔离的核心数量时,您实际上需要非常仔细地加以考虑。