Создание процессов и исполнение программ



Скачать 336,76 Kb.
страница1/7
Дата12.09.2017
Размер336,76 Kb.
  1   2   3   4   5   6   7
    1. СОЗДАНИЕ ПРОЦЕССОВ И ИСПОЛНЕНИЕ ПРОГРАММ

      1. Обзор


Этот раздел объясняет, что такое процесс и чем он отличается от программы. Вы изучите взаимодействие между родительским процессом и одним или более порожденными процессами (подпроцессами). Также обсуждается создание подпроцесса, исполнение другой программы в том же процессе, заверение процесса и ожидание завершения порожденного процесса.

      1. Что такое процесс? - Обзор

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

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

. содержимого регистров процессора (контекста процесса)

. пользовательского стека процесса и системного стека, используемого при обработке системных вызовов

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

Образ процесса есть размещение процесса в памяти в заданный момент времени. Образ процесса представляет собой набор отображённых в виртуальную память сегментов, представляющих собой код основной программы, сегмент данных, сегменты кода и данных разделяемых библиотек, отображённые на память файлы, сегменты разделяемой памяти System V IPC и др. Обратите внимание, что программа является частью образа процесса.

Благодаря тому, что отображённые в память сегменты не обязаны быть загружены полностью и подкачиваются с диска по мере необходимости, а также благодаря тому, что сегменты кода и неизмененные части сегментов данных у различных процессов могут размещаться в разделяемой памяти, общий объем образов всех процессов в системе может превосходить объем физического ОЗУ.

Каждый процесс имеет собственное виртуальное адресное пространство и, таким образом, защищён от ошибок и злонамеренных действий кода, запущенного другими пользователями.

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

Процесс представляет собой изменяющийся со временем динамический объект. Процесс может создать один или более порождённых процессов, используя системный вызов fork(2). Кроме того, он может изменить свою программу, используя системный вызов exec(2). Процесс может приостановить исполнение, используя системные вызовы wait(2) или waitid(2). Он может также завершить своё исполнение системным вызовом exit(2).

Многие прикладные программы реализованы не в виде единой монолитной программы, а в виде нескольких или даже множества взаимодействующих процессов. Это позволяет

повысить отказоустойчивость: аварийное завершение одного процесса не обязательно приводит к нарушению работы всей программы,

реализовать принцип минимума привилегий: каждый процесс исполняется с теми правами, которые необходимы ему для выполнения его функций, но не более,

обойти ограничение на размер образа процесса, что было очень актуально на 16-разрядных компьютерах, а в последние годы становится актуально на 32-разрядных машинах, а также некоторые другие ограничения, например, ограничение на количество одновременно открытых файлов,

распределить вычислительную нагрузку по нескольким процессорным ядрам или виртуальным процессорам. Эту задачу можно также решать с использованием многопоточности, но многие современные прикладные программы были разработаны до того, как были стандартизованы API и средства для многопоточного программирования.


      1. Создание процесса


Системный вызов fork(2) создаёт новый процесс, исполняющий копию исходного процесса. В основном, новый процесс (порождённый или дочерний) идентичен исходному (родителю). В описании fork(2) перечислены атрибуты, которые порождённый процесс наследует от родителя, и различия между ними.

Дочерний процесс наследует все отображённые на память файлы и вообще все сегменты адресного пространства, все открытые файлы, идентификаторы группы процессов и сессии, реальный и эффективный идентификаторы пользователя и группы, ограничения rlimit, текущий каталог, а также ряд других параметров, которые будут обсуждаться в следующих разделах.

Дочерний процесс НЕ наследует: идентификатор процесса, идентификатор родительского процесса, а также захваченные участки файлов. В большинстве Unix-систем, дочерний процесс не наследует нити исполнения, кроме той, из которой был вызван fork(2). Однако в Solaris предоставляется системный вызов forkall(2), который воспроизводит в дочернем процессе все нити родительского. Этот системный вызов не имеет аналогов в стандарте POSIX и его использование приведёт к проблемам при переносе вашей программы на другие платформы.

После возврата из fork(2), оба процесса продолжают исполнение с той точки, где fork(2) был вызван. Процессы могут узнать, кто из них является родителем, а кто порождённым, на основании значения, возвращённого fork(2).

Родительский процесс получает идентификатор порождённого процесса, положительное число. Порождённый процесс получает нулевое значение. Как правило, за fork(2) следует оператор if или switch, который определяет, какой код исполнять для родительского и какой для порождённого процесса.

Системный вызов fork(2) может завершиться неудачей, если вы пытаетесь превысить разрешённое количество процессов для каждого пользователя или общее количество процессов в системе. Эти два ограничения устанавливаются при конфигурации операционной системы. Если fork(2) завершается неуспехом, он возвращает значение -1. Рекомендуется проверять код возврата этого и остальных системные вызовы на предмет неудачного завершения.


      1. Системный вызов fork(2)


Эта иллюстрация показывает родительский процесс до вызова fork(2) и после того, как этот вызов возвратил управление. После fork(2) исполняются два процесса с различными идентификаторами. Сегменты текста, данных и стека у родительского и порождённого процессов идентичны. Для программы с разделяемым сегментом TEXT (компилятор по умолчанию создаёт именно такие программы), сегмент кода, в действительности, будет одним и тем же физическим сегментом. После fork(2) только увеличится счётчик ссылок на него.

Оба процесса имеют почти одинаковые пользовательские области. Так как пользовательская область содержит таблицу дескрипторов файлов, все перенаправления ввода/вывода, сделанные в родительском процессе, наследуются потомком. Захваты файлов являются собственностью процесса, поэтому подпроцесс не унаследует захватов файлов, сделанных родителем. Отображение файлов на память при fork(2) сохраняется.

При этом, если сегмент отображался в режиме MAP_SHARED, родительский и порождённый процессы используют одну и ту же физическую память; если такой сегмент доступен для модификации, то родитель и потомок будут видеть вносимые в эту память изменения. Большинство разделяемых сегментов в Unix-системах — это сегменты кода, недоступные для модификации.

Если же сегмент отображался как MAP_PRIVATE или MAP_ANON (по умолчанию, сегменты данных и стека отображаются именно так), процессы получают собственные копии соответствующих страниц. В действительности, копирование происходит при первой записи в страницу. Непосредственно после fork(2), приватные сегменты остаются разделяемыми, но система устанавливает на страницы этих сегментов защиту от записи. Чтение таких страниц происходит без изменений, но при попытке модификации такой страницы, диспетчер памяти генерирует исключение защиты памяти. Ядро перехватывает это исключение, но вместо завершения процесса по SIGSEGV (как это происходит при обычных ошибках защиты памяти), создаёт копию приватной страницы и отображает эту копию в адресное пространство того процесса, который пытался произвести запись. Такое поведение называется копированием при записи (copy-on-write).

Поскольку большая часть памяти родительского и порождённого процессов является разделяемой, fork(2) представляет собой относительно дешёвую операцию, во всяком случае, существенно более дешёвую, чем создание процесса в Win32, но существенно более дорогую, чем создание нити в рамках процесса.



      1. Поделитесь с Вашими друзьями:
  1   2   3   4   5   6   7


База данных защищена авторским правом ©grazit.ru 2017
обратиться к администрации

    Главная страница