如何在linux中的进程(线程?)ID相关的优先级和调度程序策略?

pau*_*doo 6 linux scheduling thread-priority

我正在调查如何让我的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在命令行上运行它时,我注意到我的桌面应用程序(例如文本编辑器)的交互性显着下降.我有一台双核机器,所以我并不为此感到惊讶.

为了解决这个问题,我的第一个想法是用这个过程很好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.)

caf*_*caf 2

线程 ID 与 PID 来自同一命名空间。这意味着每个线程都可以通过其 TID 单独寻址 - 某些系统调用确实适用于整个进程(例如,kill),但其他系统调用仅适用于单个线程。

调度程序系统调用通常属于后一类,因为这允许您为进程中的不同线程提供不同的调度程序属性,这通常很有用。