Современные операционные системы

Современные операционные системы
Что такое операционная система / Системные вызовы для управления процессами

Системные вызовы для управления процессами




Первая группа вызовов в табл. 1.1 предназначена для управления процессами. Начнем рассмотрение системного вызова fork. Вызов fork является единственным существующим в POSIX способом создания нового процесса.

Он создает точную копию исходного процесса, включая все дескрипторы файлов, регистры и т. п. После выполнения вызова fork исходный процесс и его копия (родительский и дочерний процессы) выполняются независимо друг от друга. На момент разветвления все их соответствующие переменные имеют одинаковые значения, но поскольку родительские данные копируются в дочерний процесс, последующие изменения в одном из них не влияют на изменения в другом. (Текст программы, не подвергающийся изменениям, является общим как для родительского, так и для дочернего процесса.) Системный вызов fork возвращает нулевое значение для дочернего процесса и равное идентификатору дочернего процесса или PID — для родительского. Используя возвращенное значение PID, два процесса могут определить, какой из них родительский, а какой — дочерний.

В большинстве случаев после вызова fork дочернему процессу необходимо выполнить программный код, отличный от родительского. Рассмотрим пример работы системной оболочки. Она считывает команду с терминала, создает дочерний процесс, ожидает, пока дочерний процесс выполнит команду, а затем считывает другую команду, если дочерний процесс завершается. Для ожидания завершения дочернего процесса родительский процесс выполняет системный вызов waitpid, который просто ждет, пока дочерний процесс не закончит свою работу (причем здесь имеется в виду любой дочерний процесс, если их несколько). Системный вызов waitpid может ожидать завершения конкретного дочернего процесса или любого из запущенных дочерних процессов, если первый параметр имеет значение -1. Когда работа waitpid завершается, по адресу, указанному во втором параметре — statloc, заносится информация о статусе завершения дочернего процесса (нормальное или аварийное завершение и выходное значение). В третьем параметре определяются различные необязательные настройки.

Теперь рассмотрим, как вызов fork используется оболочкой. После набора команды оболочка создает дочерний процесс, который должен выполнить команду пользователя. Он делает это, используя системный вызов execve, который полностью заменяет образ памяти процесса файлом, указанным в первом параметре. (Фактически сам системный вызов называется exec, но некоторые библиотечные процедуры со слегка отличающимися именами вызывают его с различными параметрами. Здесь мы будем рассматривать все это как системные вызовы.) В листинге 1.1 показано использование fork, waitpid и execve предельно упрощенной оболочкой. Суп Фо Бо



Полное описание: Системные вызовы для управления процессами




С этим описанием рассматриваются следующие темы:


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

Функции Win32 CreateProcess
В Windows все происходит иначе: одним вызовом функции Win32 CreateProcess создается процесс, и в него загружается нужная программа. У этого вызова имеется 10 параметров, включая выполняемую программу, параметры командной строки для этой программы, различные параметры безопасности, биты, управляющие наследованием открытых файлов, информацию о приоритетах, спецификацию окна, создаваемого для процесса (если оно используется), и указатель на структуру, в которой вызывающей программе будет возвращена ... Читать

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

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

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