我正在研究如何在后台运行 CPU 密集型任务时让我的 Linux 桌面体验保持流畅和交互。这是我用来模拟 CPU 负载的示例程序(用 Java 编写):
public class Spinner {
public static void main(String[] args)
{
for (int i = 0; i < 100; i++) {
(new Thread(new Runnable() {
public void run() {
while (true);
}
})).start();
}
}
}
当我在命令行上运行它时,我注意到我的桌面应用程序(例如文本编辑器)的交互性显着下降。我有一台双核机器,所以我对此并不感到惊讶。
为了解决这个问题,我的第一个想法是使用renice -p 20 <pid>
. 但是我发现这并没有太大影响。ls /proc/<pid>/task | xargs renice 20 -p --
相反,我必须使用具有更大影响的东西来修改所有子进程。
我对此感到非常困惑,因为我不希望线程有自己的进程 ID。即使他们这样做了,我也希望renice
对整个进程采取行动,而不仅仅是进程的主线程。
有没有人清楚地了解这里发生的事情? 看起来每个线程实际上是一个单独的进程(至少它有一个有效的 PID)。我知道历史上 Linux 是这样工作的,但我相信 NPTL 在几年前就已经修复了。
我正在 RHEL 5.4(Linux 内核 2.6.18)上进行测试。
(顺便说一句。如果我尝试使用sched_setscheduler(<pid>, SCHED_BATCH, ..)
它来解决这个交互性问题,我会注意到同样的效果。即,我需要对我看到的所有“子”进程进行此调用,/proc/<pid>/task
仅执行一次是不够的在主程序 pid 上。)