在 Linux 内核中,除了这些情况之外,任务的“nice”优先级是否会在其他任何地方被修改?

Inside the Linux kernel, does the `nice` priority level of a task get modified anywhere else beside these cases?

在 Linux 内核中,我想覆盖所有常规进程(例如调度 class SCHED_NORMAL) 进程 ID 不一致。

我发现进程的默认设置是在/source/init/init_task.c中启动的,包括设置为默认值MAX_PRIO - 20(即120)的优先级值,因为可以可以在init_task.

的struct定义的定义中看到

我的理由是,如果我要在 init_task.c 中修改这些默认设置,它应该涵盖所有情况,除了任何调用系统调用 sys_setpriority 的用户(通过使用 nice 命令为例)。这是正确的,还是有任何其他情况可以修改任务的 prio

I discovered that the default settings of a process are initiated in /source/init/init_task.c

没有。那是 init 任务本身的定义,它不用于初始化 [ialize] 新任务。 init 任务是内核启动时 运行 的第一个用户空间任务,它的 task_struct 是硬编码的,以提高性能和易用性。任何其他任务都是通过 fork 系统调用创建的。

My reasoning is that if I were to modify these default settings in init_task.c, it should cover all cases

它实际上并没有涵盖任何内容,只是 init 的初始优先级,它可以很好地覆盖它本身,因为它以 root.

运行

任务的优先级可以通过不同的方式改变,但内核不应该“自动”改变任务的优先级,至少据我所知 .

因此,如果您想以这种方式“控制”优先级,最好的办法是更改 fork 的代码(特别是 clone_process()),因为分叉是唯一的在 Linux.

中创建新进程的方法

除此之外,还有其他系统调用可以最终修改进程的优先级。快速浏览一下内核代码,至少sched_setscheduler (source), sched_setparam (source), and setpriority (source).