Процессы

 

Наряду с файлом, понятие процесса является важнейшим в концепции открытых операционных систем.

Процесс – это обладающая уникальным идентификатором единица исполняемого кода[35]в памяти.

Подавая простую команду из оболочки, оператор дает ОС указание запустить другой процесс. В ходе исполнения процесс может порождать другие процессы и проходить целый ряд состояний , некоторые из которых будут ниже описаны. Сама оболочка также является процессом, порожденным, как правило, процессом регистрации в системе, который, в свою очередь, как правило, порождается особым инициализационным процессом.

Подобно файлам, процессы в своем отношении друг к другу могут быть представлены в виде иерархии (дерева). В отличие от иерархии файлов, ребра этого дерева представляют не отношения вложенности, но отношения порождения («родитель‑ребенок»). Процесс не может появиться в системе иначе, нежели будучи порожденным другим процессом, за очевидным исключением «корневого» процесса, запускаемого самим ядром при загрузке системы. Само ядро не является процессом[36].

Исследовать процессы можно стандартной командой «ps». Поданная без параметров, она выводит информацию о текущей оболочке и порожденных ею процессах.

 

Рис. 1‑45

 

В выводе на Рис. 1‑45 присутствуют четыре колонки. «PID» – это уникальный для системы идентификатор процесса (он устанавливается при порождении процесса и сохраняется неизменным до его завершения», «TTY» – терминал , с которого запущен процесс, «TIME» – время процесса (сумма квантов процессорного времени, потребленного процессом на момент «снимка» его состояния), «CMD» – команда , подача которой привела к порождению процесса.

В данном случае Алиса получила информацию о двух процессах: оболочке «bash» и внешней команде «ps»[37].

Команда «ps ‑A» выводит информацию обо всех процессах в системе[38]. В примере на Рис. 1‑46 мы, подав команду из эмулятора терминала, для наглядности использовали ключ «‑A» вместе с ключом «‑l» («эль»), задающим «длинный» формат вывода (с дополнительными полями) и нестандартным ключом «‑H», представляющим с помощью отступов в поле «CMD» отношения между процессами (вывод немного сокращен).

 

Рис. 1‑46

 

Несколько иной набор параметров процесса можно получить, использовав вместо ключа «‑l» ключ «‑w», а ключ «‑o» позволяет вывести для каждого процесса произвольный набор параметров из числа поддерживаемых системой, указав их мнемонику в качестве аргумента этого ключа.

Стандартом определено пятнадцать параметров, к которым могут добавляться параметры, специфичные для конкретной системы. Мы разберем лишь некоторые из них.

UID – это идентификатор пользователя‑владельца процесса. Как и у файла, у процесса есть владелец. В данном примере (при использовании ключа «‑l») идентификатор выводится в числовом виде; если бы был задан ключ «‑w», мы бы увидели, что числовому идентификатору 504 соответствует символический идентификатор «maksim», 505 – «alice». Числовой идентификатор 0 всегда соответствует главному пользователю «root».

Обычно UID наследуется от процесса‑родителя. Исключение составляют процессы‑оболочки, запускаемые программой регистрации – их UID соответствует идентификатору зарегистрировавшегося пользователя, хотя UID самой программы регистрации – 0.

Еще одно исключение – процессы, порожденные запуском программы из файла с установленным битом SUID. Их UID соответствует не породившему их процессу, а владельцу исполняемого файла. SUID (и подобный ему по эффекту бит GUID) – это мощный (и очень опасный) инструмент обхода системы распределения полномочий в ОС, поскольку позволяет пользователю запускать процессы с полномочиями выше собственных (в том числе, с полномочиями главного пользователя). Установить SUID бит может только главный пользователь. В аккуратно построенной и администрируемой системе количество программ с установленным SUID (и/или GUID) битом минимально.

В нашем примере этот механизм с очевидностью использован при запуске процесса «X» (Икс‑сервер – основной компонент графической системы, предоставляющий в распоряжение Икс‑клиентов (программ с графическим интерфейсом) виртуальный X‑терминал, связанный с физическими видеоадаптером, клавиатурой, мышью и системным динамиком), чьим родителем является процесс «xinit» с UID равным 504. Существенно, что Икс‑клиенты (процессы «blackbox», «soffice.bin», «mozilla‑bin», «xterm») выполняются с обычным пользовательским UID.

PID , как мы уже знаем, это уникальный идентификатор процесса[39], а PPID – идентификатор его родителя. Обратите внимание на соответствие между PPID различных процессов в примере и расположением их в сформированном ключом «‑H» «дереве».

TIME – время процесса – это совокупное количество процессорного времени, потребленного процессором на выполнение этого процесса за время его существования.

S – это состояние процесса. Запущенный процесс может находиться в одном из четырех стандартных состояний: «R» (выполняемый), «S» (ожидающий ввода‑вывода), «T» (приостановленный – приостановку процессов мы обсудим ниже), «Z» («зомбированный», уже завершенный, но не успевший сообщить об этом процессу‑родителю).

Итак, в примере на Рис. 1‑46 мы видим:

находящийся в корне дерева процесс «init»;

два порожденных им процесса, не имеющих управляющего терминала: демон управления системой энергосбережения «apmd»[40]и демон периодического исполнения заданий «crond»;

порожденный процессом init процесс «login» с tty1 в качестве управляющего терминала;

порожденный этим процессом «login» процесс «bash» – экземпляр оболочки также с tty1 в качестве управляющего терминала;

порожденный процессом «bash» процесс «xinit» (это сценарий, запускающий компоненты графической среды);

порожденные процессом «xinit» процессы «X» (это сервер оконной системы X, он запущен в качестве демона, т.е. без управляющего терминала) и «blackbox» (это менеджер окон графической среды);

порожденные процессом «blackbox» процессы «soffice.bin» (это словарный процессор «OpenWriter», в котором набирается данный текст), «mozilla‑bin» (браузер «Мозилла»), «xterm» (эмулятор текстового терминала). Они не имеют управляющего терминала;

порожденный эмулятором терминала процесс оболочки «bash» с псевдотерминалом pts/0, назначенным при запуске эмулятора терминала, в качестве управляющего;

порожденный этой оболочкой процесс «ps», который и осуществил приведенный в примере вывод;

порожденный процессом «init» процесс «login» и порожденный им процесс «bash» на терминале tty2.