2016-09-24 4 views
1

Предположим, что у меня есть дочерний процесс, для которого я планировал политику SCHED_BATCH, используя функцию библиотеки C, sched_setscheduler, и теперь этот дочерний процесс создает внешний процесс, используя execvp системный вызов.Планирование политики в системном вызове exec после fork

Будет ли планировщик нового процесса создан таким же, как у предыдущего дочернего процесса, то есть являются политиками планирования, унаследованными при системном вызове execvp? Я прочитал справочную страницу, в которой указано, что политики FIFO и RR наследуются, но как насчет обычных политик, таких как SCHED_BATCH, SCHED_IDLE и SCHED_OTHER?

Есть ли какая-либо функция exec, которая поддерживает наследование всех политик планирования?

ответ

0

Во-первых, exec Семейство системных вызовов не выполняет собственное изображение, а выполняет бинарные файлы. Согласно man exec:

The exec() family of functions replaces the current process image with a new process image.

Так, он будет вести себя, как этот конкретный исполняемый образ был готов планироваться.

Когда процесс помечается как SCHED_BATCH, они будут планироваться на основе их хороших значений, как SCHED_OTHER. Поскольку пакетные задачи не требуют взаимодействия с пользователем, поэтому планировщик рассматривает задачу как интенсифицированную ЦП. Согласно man sched_setschedparam цитата из SCHED_BATCH: Scheduling batch process -

This policy is similar to SCHED_OTHER in that it schedules the process according to its dynamic priority (based on the nice value).The difference is that this policy will cause the scheduler to always assume that the process is CPU-intensive. Consequently, the scheduler will apply a small scheduling penalty with respect to wakeup behaviour, so that this process is mildly disfavored in scheduling decisions.

Поэтому, если изменить политику планирования процесса, чтобы SCHED_BATCH, это будет планироваться так же, как почти все нормальные процессы (SCHED_OTHER, политики планирования по умолчанию). Если вы хотите отступить полностью к поведению по умолчанию, вы должны использовать флаг SCHED_RESET_ON_FORK ORed с политикой планирования. Если вы укажете этот флаг, любой вновь созданный процесс вернется к политике планирования по умолчанию, скорее скопив поведение родителя.

Надеюсь, это поможет!

+0

В основном то, что я прошу, несколько отличается, я сначала устанавливаю планировщик нового дочернего процесса «forked» как 'SCHED_IDLE', используя' sched_setscheduler', теперь этот разветвленный дочерний процесс создает новый процесс с использованием 'execvp' системы -call, заменив таким образом образ дочернего процесса. Итак, будет ли этот вновь созданный процесс иметь тот же планировщик «SCHED_IDLE», что и дочерний процесс, который его создал, или он может быть другим? – Jarvis

+0

Опять же, 'execvp' не создает новый процесс, он заменяет образ вызывающего процесса. Существует разница между fork() и exec(). 'fork()' дублирует вызывающий процесс (что означает создание нового пространства в памяти, execvp - нет). –

+0

Да, если он заменяет свое изображение, тогда планировщик первого процесса будет таким же для нового процесса, не так ли? – Jarvis

Смежные вопросы