【发布时间】:2011-07-27 13:05:01
【问题描述】:
我正在研究如何让我的 Linux 桌面体验在后台运行 CPU 密集型任务时保持流畅和交互。这是我用来模拟 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上执行一次是不够的。)
【问题讨论】:
标签: linux scheduling thread-priority