当执行 make -jn 时,有 n > m,其中 m 是物理上可用的 CPU 的数量,这些 n - m 个作业会发生什么?是只调度了 m 个作业以执行到操作系统,其余的 n - m 个作业按 make 排队,还是所有 n 个作业都已调度并且操作系统在它们之间切换上下文?
后者:所有调度的n个作业,操作系统在它们之间切换上下文。
Linux 通常尝试以公平的方式处理进程,因此,如果您使用 make -j
(没有进程计数限制)编译一个大型项目,这可能会用进程淹没您的机器并使其停止(由于交换,因为所有进程都不适合 RAM)。
Solaris 10没有受到这种影响。
当使用随作业数量线性扩展的构建系统(例如非递归制作)在 Linux 上进行编译时,经验法则是不要使用比逻辑 CPU 更多的作业(即超线程内核是逻辑 CPU)。一点经验数据。