在 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).
在 Linux 内核中,我想覆盖所有常规进程(例如调度 class SCHED_NORMAL
) 进程 ID 不一致。
我发现进程的默认设置是在/source/init/init_task.c中启动的,包括设置为默认值MAX_PRIO - 20
(即120
)的优先级值,因为可以可以在init_task
.
我的理由是,如果我要在 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).