Добавил:
github.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
30.09.2023
Размер:
875.49 Кб
Скачать
    1. Иерархия процессов

В отличии от ОС Windows, в которой процессы не имеют организованной структуры, подсистема управления процессами в ядре Linux построена по принципу ориентированного дерева: каждый процесс может быть запущен только одним из ранее запущенных процессов. В вершине дерева пользовательских процессов находится процесс-демон init (PID равный 1), который зачастую в современных дистрибутивах ОС Linux заменяется процессом-демоном systemd.

При запуске каждого нового процесса в ОС PID порождаемого процесса инкрементируется относительно PID последнего процесса, до тех пор, пока не будет достигнуто максимально возможное значение, хранящееся в файле «/proc/sys/kernel/pid_max». После этого счетчик сбрасывается, и инкрементация PID начинается заново.

Посмотреть существующие в системе процессы с отображением их иерархии и дополнительной информацией можно с помощью команды

ps -efH

На Рисунке Рисунок 4 представлен фрагмент выводимого дерева процессов данной командой.

Рисунок 4. Фрагмент дерева процессов

В вершине дерева находится процесс init с полным именем исполняемого файла /sbin/init (PID равный 1), который располагается по данному пути в соответствии со стандартом POSIX. Данный процесс при старте проверяет конфигурационные файлы и порождает остальные процессы. Среди них есть процесс «/usr/sbin/sshd» (PID равный 453), который представляет собой процесс-демон (службу) для удаленного доступа к системе. Ввиду удаленного подключения к ОС через данную службу она имеет дочерний процесс «sshd: pi» (PID равный 868), где pi – имя пользователя, для которого было осуществлено подключение. Данный процесс так же имеет дочерний процесс, который отвечает за терминал ввода-вывода данных pts/0 (PID процесса равен 945). В процессе терминала создан дочерний процесс bash (PID равный 948), который представляет собой командную оболочку для интерпретации пользовательских команд. Каждый раз, когда пользователь взаимодействует с командной оболочкой и вводит новые команды, в ней порождаются новые дочерние процессы, которые, в свою очередь, тоже могу порождать новые дочерние процессы и так далее. Например, на Рисунке Рисунок 4 в командной оболочке была вызвана команда для просмотра дерева процессов «ps -efH», которая является дочерним процессом командной оболочки (PID равный 1050).

У каждого процесса в системе помимо его собственного PID есть так же информация о его родительском процессе – PPID (Parent Process Identifier). В случае, если родительский процесс завершился раньше дочернего, PPID у последнего изменяется на значение 1 (процесс init), поскольку данный процесс не может быть завершен до тех пор, пока работает ОС.

    1. Запуск процессов

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

Одним из очевидных способов решения данной проблемы является порождение в ОС еще одного экземпляра командной оболочки с помощью еще одного терминала, однако это не всегда бывает возможно или удобно для пользователя. Однако в ОС Linux существует простой способ, позволяющий запускать процессы «в фоновом режиме» внутри командной оболочки. Для этого в конце любой команды необходимо поставить знак «&»:

<command> &

Например,

cp -r /home/pi/data /home/ivan/data & # копирование данных в фоновом режиме

После запуска процесса в фоновом режиме командная оболочка будет сразу доступна для ввода новых команд – стандартный поток ввода stdin дочернего процесса будет откреплен от командной оболочки. При этом стандартные выводы stdout и stderr дочернего процесса будут по-прежнему выводиться в терминал.

При запуске нового процесса в фоновом режиме в терминале появится сообщения формата

[jobspec] PID

где jobspec – номер запущенного фонового процесса по порядку начиная с 1, а PID – идентификационный номер фонового процесса. При штатном завершении фонового процесса в терминале появится сообщение формата

[jobspec]+ Done <command>

Просмотреть все запущенные фоновые процессы в данной командной оболочке можно с помощью команды

jobs -l

Вернуть исполнение процесса из фонового режима на передний план можно с помощью команды

fg %jobspec%

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

Соседние файлы в папке OS_labs