我正在研究如何在后台运行 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 上执行一次是不够的。)
最佳答案
线程 ID 来自与 PID 相同的命名空间。这意味着每个线程都可以通过其 TID 单独寻址 - 一些系统调用确实适用于整个进程(例如,kill
),但其他系统调用仅适用于单个线程。
调度器系统调用一般在后一类中,因为这允许您为进程内的不同线程赋予不同的调度器属性,这通常很有用。
关于linux - linux 中与进程(线程?)ID 相关的优先级和调度程序策略如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844783/