Управление процессами.
Процессы в UNIX.
Процесс – запущенная на выполнение программа.
Каждый процесс выполняется в своем адресном пространстве и на своем виртуальном процессоре. Процесс при своем запуске наследует от родителя открытые файлы, каналы и устройства, а так же среду выполнения, которая определена набором значений различных переменных среды. Состояние процесса в каждый момент времени определяется состоянием его адресного пространства, его виртуального процессора и среды окружения. Все эти состояния вместе называются образом, или контекстом процесса. Контекст принято рассматривать состоящим из трех частей:
пользовательская часть контекста
регистровая часть
системная часть
Пользовательская часть определяется сегментами кода, данных и стека, открытыми файлами. Регистровая часть контекста определяется состоянием регистров процессора, а системная часть – набором элементов таблиц, связанных с процессором.
Планировщик системы осуществляет переключение контекста в следующих случаях:
процесс перешел в состояние ожидания какого-либо ресурса (добровольное переключение контекста)
в системе обнаружен процесс с более высоким приоритетом (принудительное переключение контекста)
При переключении планировщик сохраняет контекст текущего процесса и восстанавливает контекст следующего.
В Unix все выполняемые процессы связанны родственными отношениями в дерево:
В вершине дерева находиться процесс init, который активируется при загрузке системы и запускает другие процессы.
Каждый процесс имеет свой уникальный идентификатор PID, также ему известен идентификатор родительского процесса PPID.
Каждый процесс может работать в двух режима: пользовательском, когда ему доступно только свое адресное пространство и системном, когда имеет доступ к системным данным ОС. В системный режим пользовательский процесс переводиться для выполнения вызываемой им системной функции. При работе в системном режиме процесс не может быть прерван, т.е. планировщик не может переключать контексты процессов, работающих в системном режиме.
В различных системах существует разное количество пассивных состояний процессов. Граф состояний процессов имеет следующий вид:
Процесс создается с состоянием SNONE.
SNONE - характеризует состояние, когда в системной таблице процессов уже есть элемент для нового процесса, но не выделена память и не создан контекст.
SIDL – состояние, когда для процесса выделена память, создан контекст, но он не готов к выполнению и не находиться в очереди планировщика.
SRUN – процесс готов к выполнению и находиться в очереди готовых процессов планировщика.
Процессы ожидают, когда планировщик выделит им время центрального процессора (ЦП). После выделения времени ЦП процесс переходит в активное состояние RUNNING. В случае принудительного переключения контекста процесс опять переходит в состояние SRUN. Если в ходе выполнения процесс перешел в ожидание какого-либо ресурса, он переводиться в состояние SSLEEP, а после освобождения занятого ресурса снова переводиться в SRUN.
Если в процессе выполнения процесс завершится, то он переводиться в SZOMB. Это состояние характеризуется тем, что у процесса уничтожен контекст, освобождена память, но остались записи в системной таблице процессов. В таком состояние процесс будет находиться до тех пор, пока родитель не считает из системной таблицы процессов информацию о его завершении.
Выполняемый процесс переводиться в состояние SSTOP, если ему был направлен специальный сигнал SIGSTOP. Чтобы продолжить выполнение приостановленному процессу, ему необходимо получить сигнал SIGCONT. После чего он перейдет в SRUN. Однако, если сигнал SIGSTOP был получен процессом в состоянии SSLEEP, то после получения SIGCONT он вернется в SSLEEP.
Обычно процессы запускаются с помощью командного процессора Shell, поэтому Shell является родителем для большинства пользовательских процессов.
Shell позволяет запускать процессы в двух режимах: оперативном (запущенный процесс имеет связь с консолью) и фоновом (выполняется в отсоединенном от консоли состоянии).
Запущенный процесс захватывает консоль, поэтому Shell до окончания запущенного процесса не может работать с консолью и воспринимать команды.
В случае работы в фоновом режиме прикладной процесс не взаимодействует с консолью, поэтому Shell может параллельно с запущенным процессом воспринимать команды и выполнять их
Для того, чтобы посмотреть состояние запущенного пользовательского процесса используется команда ps [PID].
Если PID не указан, то выводится состояния всех запущенных пользовательских процессов.
Дата добавления: 2020-10-01; просмотров: 331;