2009-10-02 3 views
7

Просьба сообщить мне разницу между идентификатором группы процессов и заданием. Является ли jobid встроенным в программу оболочки или связано с ядром? Каково использование каждого из них? Когда процесс выполняется в фоновом режиме, задан ли только набор заданий или установлен ли pgid? Какова польза функции setpgid()?Разница между идентификатором группы процессов и идентификатором задания в UNIX

Когда процесс выполняется в фоновом режиме, связано ли это ядро ​​или оболочка заботится о том, что является фоном или передним планом?

ответ

13

Хорошие вопросы. Идентификатор задания в основном представляет собой оболочку. В ядре есть поддержка в виде сигналов, которые участвуют в управлении заданиями, и о том, как ядро ​​точно знает, какие процессы посылать сигналы управления заданиями.

Строго говоря, ответ на ваш первый вопрос заключается в том, что идентификатор задания - это просто создание оболочки. Он существует потому, что конвейер (или, реже, другая сгруппированная оболочка) может состоять из нескольких процессов, которые должны контролироваться как единое целое.

Чтобы ответить на ваш последний вопрос, оболочка начинает все процессы, сначала сделав fork(2), а затем выполнив execve(2). Единственная разница с & заключается в том, что оболочка не делает wait(2) (или связанный вариант), и поэтому программа может продолжить «в фоновом режиме». В Unix практически нет различий между передним и задним фонами.

Группа процессов - это ассоциация, определенная оболочками, так что ядро ​​знает об одном процессе «переднего плана», который обрабатывает множество различных «фоновых» процессов. Это в основном важно, чтобы фоновые процессы генерировали сигнал, если они решили внезапно прочитать с терминала. (Такой терминал, вероятно, подключен к стандартным входам.) Это заставит «задание» генерировать сигнал, и оболочка предложит пользователю что-то сделать.

Попробуйте (sleep 5; read x)& и через 6 секунд введите возврат или что-то еще, чтобы оболочка просыпалась. Вот когда вы видите что-то вроде ...

[1] + Stopped (сон 5, прочитать х)

... и затем ввести fg, чтобы вытащить его на передний план.

Первоначально Unix имел конвейеры, и у него было &, но не было возможности переместить команду или конвейер между передним и задним планом и не помогать фоновому процессу, который внезапно решил прочитать стандартный ввод.

Управление заданиями и поддержка ядра для него были добавлены Биллом Джой и другими в ранних версиях BSD и csh (1). Они были взяты за линию коммерческого Unix и клонированы для работы как ядро ​​Linux.


Что касается вопросов о технологических группах и ps(1) ... В целях поддержки управления заданиями в оболочках, состояние ядра процесса включает в себя идентификатор группы процессов и идентификатор сеанса. A группа процессов и работа - это то же самое, но номер вакансии - это всего лишь ручка, из которой состоит оболочка. Процесс является лидером сеанса, если идентификатор сеанса совпадает с идентификатором pid, а процесс является лидером группы процессов, если pgid совпадает с pid.Я считаю, что что-то немного более тонкое происходит с +, что ps(1) печатает. Каждый терминал знает, какова его группа процессов переднего плана, поэтому я считаю, что процесс получает + if pid == pgid & & (pgid - это передний план pg для управляющего терминала).

Таким образом, ядро ​​хранит несколько элементов состояния: pid, pgid, sid, и процесс может иметь управляющий терминал, а терминал может иметь переднюю панель pgid. Эти учетные данные в основном предназначены для поддержки управления заданиями, но также используются для отмены доступа к терминалу при выходе пользователя из системы.

+0

В примере для группы процессов используется группа процессов. PLease explani подробно объясняет, как задействована группа процессов. – avd

+0

Еще одна вещь, вы написали, что передние процессы контролируют фоновые процессы, можете ли вы привести пример? – avd

+0

Извините, еще одно сомнение: u написал, что идентификатор задания встроен в оболочку, поэтому foreground/background - это понимание оболочки, но когда мы делаем «ps», тогда он отображается в статистике как «R» или «R +» в качестве фонового процесса переднего плана но ps выполняется ядром, так как ядро ​​знает, что задание вернулось/переднем плане. – avd

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