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

标签 linux scheduling thread-priority

我正在研究如何在后台运行 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/

相关文章:

multithreading - 缺少OpenMP功能: Thread Priority

c# - 如何使用单声道将 .NET Windows 服务应用程序迁移到 Linux?

python - 计算调度问题中的雇用天数

multithreading - 操作系统了解如何使用线程的特征是否有优势?

c - 一核专用单进程

Java 优先级解决方法

c# - 更改线程优先级

linux - 如果蓝牙设备不支持 linux,那么编写自己的驱动程序是否合法?

linux - 从 Docker 内部访问蓝牙加密狗?

linux - 如何检查某个端口是否打开且未使用?