Иерархия процессов операционной системы — это способы организации связей между процессами операционной системы.
Общие сведения о процессах операционной системы
Процессом или задачей является программа, которая находиться в режиме исполнения. С каждым процессом связано его адресное пространство, из которого ему разрешается считывать и записывать в него данные. Адресное пространство имеет в своем составе следующие компоненты:
- сама программа,
- информационные данные к программе,
- программный стек.
Со всеми процессами, как правило, связан набор регистров, к примеру, это:
- счетчик команд (в процессоре), то есть, это регистр, содержащий адрес следующей стоящей в очереди на исполнение команды. После выборки команды из памяти, счетчик команд должен быть скорректирован и указатель переходит к следующей команде,
- регистр, являющийся указателем стека,
- другие регистры.
В многозадачных системах реальный процессор должен переключаться с процесса на процесс, но, для того чтобы упростить эту модель, принято рассматривать набор процессов, выполняемых параллельно (псевдопараллельно). К созданию процесса могут привести следующие основные события:
- выполнение инициализации системы,
- осуществление работающим процессом системного запроса на создание другого процесса,
- выполнение пользователем запроса на создание процесса,
- инициализация пакетного задания.
С технических позиций в любом случае новый процесс создается одинаково, а именно, работающий процесс формирует системный запрос на создание нового процесса. В операционной системе UNIX присутствует лишь один системный вызов, который направлен на формирование нового процесса:
fork (ветвление или вилка).
Такой запрос должен создать дубликат вызываемого процесса.
В операционной системе Windows вызов функции CreateProcess интерфейса способен управлять и созданием процесса, и запуском в нем необходимой программы. После того как создан новый процесс, родительский и дочерний процессы обладают собственным различным адресным пространством.
Иерархия процессов операционной системы
В отдельных системах родительский и дочерний процессы могут оставаться связанными между собой, некоторым образом. Дочерний процесс способен, в свою очередь, формировать процессы, создавая иерархию процессов.
В операционных системах UNIX присутствует жесткая иерархия процессов. Все новые процессы, которые создаются при помощи системного вызова fork, считаются как дочерние относительно предыдущего процесса. Дочернему процессу могут достаться от родительского процесса переменные, регистры и тому подобное. После выполнения вызова fork, как только родительские данные будут скопированы, последующие коррективы в одном из процессов не могут уже влиять на другой, но процессы должны помнить какой из них считается родительским. Следует подчеркнуть, что в операционной системе UNIX имеется и прародитель всех процессов, а именно, процесс init.
В операционной системе Windows не используется понятие иерархии процессов, и все процессы считаются равноправными. Но при этом имеется возможность задания специального маркера родительскому процессу, который позволяет осуществлять контроль дочернего процесса.
Процесс может находиться в одном из следующих возможных состояний:
- Состояние выполнения, то есть, процесс в данный конкретный момент использует процессор.
- Состояние готовности, то есть, процесс является временно приостановленным для того, чтобы дать возможность выполнения другим процессам.
- Состояние ожидания, то есть, процесс не может быть запущен до того момента, пока не произойдет определенное внешнее событие.
Между этими состояниями возможны следующие переходы:
- Процесс заблокирован в ожидании входных данных.
- Планировщик осуществляет выбор другого процесса.
- Планировщик осуществляет выбор данного процесса.
- Поступают входные данные.
Переходы по второму и третьему пунктам должны вызываться планировщиком процессов операционной системы, так что сами процессы даже не осведомлены об этих переходах. С точки зрения самого процесса возможны только два состояния, а именно, исполнение и ожидание.
Для того чтобы реализовать модель процессов, операционная система должна иметь таблицу (массив структур), именуемую как таблица процессов, с одним компонентом для каждого процесса, то есть, блоком управления процессом. Компоненты таблицы должны содержать информацию о состоянии процесса, счетчике команд, указателе стека, распределении памяти, а также весь остальной набор информации, который следует сохранять при переключении в состояние готовности или блокировки для последующих запусков.
В обычной операционной системе каждому процессу соответствует адресное пространство и одиночный управляющий поток. Практически это и считается определением процесса. С каждым потоком связаны следующие элементы:
- Счетчик исполнения команд.
- Регистры для текущих переменных.
- Стек потока.
- Состояние потока.
Потоки способны делить между собой компоненты своего процесса, а именно:
- адресное пространство,
- набор глобальных переменных,
- совокупность открытых файлов,
- используемые таймеры,
- различные семафоры,
- совокупность статистической информации.
По остальным параметрам модель потока является идентичной модели процесса. В POSIX и Windows присутствует поддержка потоков на уровне ядра. В Linux имеется новый системный вызов clone, предназначенный для формирования потоков, который отсутствует во всех других версиях системы UNIX. В POSIX сделан новый системный вызов pthread_create, предназначенный для формирования потоков. А в Windows существует новый системный вызов CreateThread, также предназначенный для создания потоков.
Использование потоков способно предоставить операционной системе следующие преимущества:
- Возможность упростить программу в некоторых случаях, за счет применения общего адресного пространства.
- Возможность повысить производительности самой программы, так как имеется возможность одновременного выполнения вычисления на процессоре и операции ввода-вывода.