Хорошие и дочерние процессы

22

Может кто-нибудь сказать мне, какова связь между указанным niceуровнем и дочерними процессами?

Например, если у меня есть значение niceпо умолчанию 0и я запускаю сценарий nice 5, который, в свою очередь, запускает некоторые дочерние процессы (в данном случае около 20 параллельно), что хорошего в дочерних процессах?

NWS
источник
1
Только пользователь root может уменьшить привлекательность процесса, и значение наследуется дочерними процессами в любой разумной forkреализации.
jw013
@ jw013 - Для ясности я пишу сценарии, использую &для порождения дочерних процессов, а не использую c& fork.
NWS
3
если вы не используете ОС не Unix / Linux, то вполне вероятно, что ваша оболочка порождает фоновые процессы fork.
jw013

Ответы:

28

Дочерний процесс наследует любое niceзначение, хранящееся у родителя во время его разветвления (в вашем примере, 5).

Однако, если niceзначение родительского процесса изменяется после разветвления дочерних процессов, дочерние процессы не наследуют новое niceзначение.

Вы можете легко наблюдать это с помощью инструмента мониторинга top. Если niceполе (NI) не отображается по умолчанию, вы можете добавить его, нажав fи выбрав I. Это добавит NIстолбец на topдисплей.

* I: NI = Nice value

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1937 root      20   0  206m  66m  45m S  6.2  1.7  11:03.67 X                                         

Хорошая информация от man 2 fork

fork () создает новый процесс, дублируя вызывающий процесс. Новый процесс, называемый дочерним, является точной копией вызывающего процесса, называемого родительским, за исключением следующих пунктов:

  • У дочернего элемента есть собственный уникальный идентификатор процесса, и этот PID не совпадает с идентификатором какой-либо существующей группы процессов (setpgid (2)).
  • Идентификатор родительского процесса дочернего процесса совпадает с идентификатором родительского процесса.
  • Ребенок не наследует блокировки памяти своего родителя (mlock (2), mlockall (2)).
  • Использование ресурсов процесса (getrusage (2)) и счетчики времени процессора (times (2)) сбрасываются на ноль в дочернем процессоре.
  • Дочерний набор ожидающих сигналов изначально пуст (sigpending (2)).
  • Дочерний объект не наследует настройки семафора от своего родителя (semop (2)).
  • Дочерний объект не наследует блокировки записей от своего родителя (fcntl (2)).
  • Дочерний объект не наследует таймеры от своего родителя (setitimer (2), alarm (2), timer_create (2)).
  • Дочерний объект не наследует невыполненные асинхронные операции ввода-вывода от своего родителя (aio_read (3), aio_write (3)), а также не наследует какие-либо контексты асинхронного ввода-вывода от своего родителя (см. Io_setup (2)).
Джордж М
источник