#linux-kernel
#linux-ядро
Вопрос:
Из ядра Linux я хочу перезаписать nice
приоритет (с жестко заданным значением) всех обычных процессов (например, класса планирования SCHED_NORMAL
), которые имеют неравномерный идентификатор процесса.
Я обнаружил, что настройки процесса по умолчанию инициируются в /source/init/init_task.c, включая значение приоритета, для которого установлено значение по умолчанию MAX_PRIO - 20
(т.Е. 120
), Как видно из определения определения структуры init_task
.
Я рассуждаю так: если бы я изменил эти настройки по умолчанию init_task.c
, это должно охватывать все случаи, за исключением любых пользователей, вызывающих системный вызов sys_setpriority
( nice
например, с помощью команды). Это правильно или есть какие-либо другие случаи, когда задача prio
может быть изменена?
Ответ №1:
Я обнаружил, что настройки процесса по умолчанию инициируются в /source/init/init_task.c
Нет. Это определение самой init
задачи, оно не используется для инициализации новых задач. Задача инициализации — это первая задача пользовательского пространства, которая запускается ядром при запуске, и она task_struct
жестко запрограммирована для повышения производительности и простоты использования. Любая другая задача создается через fork(2)
/ clone(2)
.
Я считаю, что если бы я изменил эти настройки по умолчанию в init_task.c, это должно охватывать все случаи
На самом деле он ничего не покрывает, только начальный приоритет init
, который вполне может перезаписать его сам, поскольку он выполняется как root
.
Приоритет задачи может быть изменен по-разному, но ядро не должно «автоматически» изменять приоритет задач, по крайней мере, насколько мне известно.
Поэтому, если вы хотите «контролировать» приоритет таким образом, лучше всего было бы изменить код fork
(в частности clone_process()
), поскольку разветвление — единственный способ создания новых процессов в Linux.
Кроме этого, существуют другие системные вызовы, которые могут в конечном итоге изменять приоритет процесса. Бегло взглянув на код ядра, по крайней мере sched_setscheduler
(исходный код), sched_setparam
(исходный код) и setpriority
(исходный код).
Комментарии:
1. Отличный ответ, действительно. У вас есть глубокое понимание Linux. Я должен был помнить, что fork() создает все процессы из процесса инициализации. Я попытаюсь исправить системные вызовы, о которых вы упомянули, если они изменят приоритет моих пользовательских процессов. То, что я пытаюсь сделать, довольно нелепо, но это для домашнего задания, а не для приложения в реальном мире.