ЗАНЯТИЕ 13. «Создание и завершение процесса»

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

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

  1. Инициализация системы.
  2. Выполнение работающим процессом системного вы¬зова, предназначенного для создания процесса.
  3. Запрос пользователя на создание нового процесса.
  4. Инициация пакетного задания.
    При запуске операционной системы создаются, как правило, несколько процессов. Некоторые из них представляют собой высо-коприоритетные процессы, то есть процессы, взаимодействующие с пользователями и выполняющие для них определенную работу. Остальные являются фоновыми процессами, не связанными с кон¬кретными пользователями, но выполняющими ряд специфических функций. Например, фоновый процесс, который может быть создан для приема входящих сообщений электронной почты, основную часть времени проводит в спящем режиме, активизируясь только по мере появления писем. Другой фоновый процесс, который может быть создан для приема входящих запросов на веб-страницы, раз¬мещенные на машине, просыпается при поступлении запроса с це¬лью его обслуживания. Фоновые процессы, предназначенные для обработки какой-либо активной деятельности, связанной, напри¬мер, с электронной почтой, веб-страницами, новостями, выводом информации на печать и т. д., называются демонами. Обычно у больших систем насчитываются десятки демонов. В UNIX1 для отображения списка запущенных процессов может быть использо¬вана программа ps. В Windows для этой цели может использоваться диспетчер задач.
    Вдобавок к процессам, созданным во время загрузки, новые процессы могут быть созданы и после нее. Часто бывает так, что работающий процесс осуществляет системный вызов для создания одного или более новых вспомогательных процессов. Создание но¬вых процессов особенно полезно, когда выполняемая работа может быть легко выражена в понятиях нескольких связанных друг с дру¬гом, но в остальном независимых друг от друга взаимодействую¬щих процессов. Например, если из сети выбирается большой объем данных для последующей обработки, наверное, будет удобно со¬здать один процесс для выборки данных и помещения их в общий буфер, чтобы в то же самое время второй процесс забирал эле¬менты данных и проводил их обработку. Также можно ускорить выполнение работы, если на многопроцессорной системе разре-шить каждому процессу работать на разных центральных процес¬сорах.
    В интерактивных системах пользователи могут запустить программу вводом команды или щелчком (двойным щелчком) на значке. Любое из этих действий дает начало новому процессу и за¬пускает в нем выбранную программу. В основанных на применении команд UNIX-системах с работающей X-оболочкой новый процесс получает окно, в котором он был запущен. При запуске в Microsoft Windows процесс не имеет окна, но он может создать одно или не¬сколько окон, и в большинстве случаев так и происходит. В обеих системах пользователи могут одновременно открыть несколько окон, в каждом из которых запущен какой-нибудь процесс. Исполь¬зуя мышь, пользователь может выбрать окно и взаимодействовать с процессом, например, если потребуется, вводить данные.
    Последнее событие, приводящее к созданию процесса, при¬менимо только к системам пакетной обработки данных, имею¬щимся на больших универсальных машинах. Представьте себе управление запасами товаров в конце рабочего дня в сети магази¬нов. Здесь пользователи могут отправлять системе пакетные зада¬ния (возможно, с помощью удаленного доступа). Когда операцион¬ная система решает, что у нее достаточно ресурсов для запуска еще одного задания, она создает новый процесс и запускает новое зада¬ние из имеющейся у нее очереди входящих заданий.
    С технической точки зрения во всех этих случаях новый процесс создается за счет уже существующего процесса, который выполняет системный вызов, предназначенный для создания про¬цесса. Этим процессом может быть работающий пользовательский процесс, системный процесс, вызванный событиями клавиатуры или мыши, или процесс управления пакетными заданиями. Данный процесс осуществляет системный вызов для создания нового про¬цесса. Этот системный вызов предписывает операционной системе создать новый процесс и прямо или косвенно указывает, какую программу в нем запустить.
    В UNIX существует только один системный вызов для со¬здания нового процесса — fork. Этот вызов создает точную копию вызывающего процесса. После выполнения системного вызова fork два процесса, родительский и дочерний, имеют единый образ па¬мяти, единые строки описания конфигурации и одни и те же откры¬тые файлы. И больше ничего. Обычно после этого дочерний про¬цесс изменяет образ памяти и запускает новую программу, выпол¬няя системный вызов execve или ему подобный. Например, когда пользователь набирает в оболочке команду sort, оболочка создает ответвляющийся дочерний процесс, в котором и выполняется ко¬манда sort. Смысл этого двухступенчатого процесса заключается в том, чтобы позволить дочернему процессу управлять его файло¬выми дескрипторами после разветвления, но перед выполнением execve с целью выполнения перенаправления стандартного ввода, стандартного вывода и стандартного вывода сообщений об ошиб¬ках.
    В Windows все происходит иначе: одним вызовом функции Win32 CreateProcess создается процесс, и в него загружается нуж¬ная программа. У этого вызова имеется 10 параметров, включая выполняемую программу, параметры командной строки для этой программы, различные параметры безопасности, биты, управляю¬щие наследованием открытых файлов, информацию о приоритетах, спецификацию окна, создаваемого для процесса (если оно исполь¬зуется), и указатель на структуру, в которой вызывающей про¬грамме будет возвращена информация о только что созданном про¬цессе. В дополнение к функции CreateProcess в Win32 имеется около 100 других функций для управления процессами и их син-хронизации, а также выполнения всего, что с этим связано.
    В обеих системах, UNIX и Windows, после создания про¬цесса родительский и дочерний процессы обладают своими соб¬ственными, отдельными адресными пространствами. Если какой-нибудь процесс изменяет слово в своем адресном пространстве, другим процессам эти изменения не видны. В UNIX первоначаль¬ное состояние адресного пространства дочернего процесса является копией адресного пространства родительского процесса, но это аб¬солютно разные адресные пространства — у них нет общей памяти, доступной для записи данных. Некоторые реализации UNIX делят между процессами текст программы без возможности его модифи¬кации. Кроме того, дочерний процесс может совместно использо¬вать всю память родительского процесса, но если память совместно используется в режиме копирования при записи (copy on write), это означает, что при каждой попытке любого из процессов модифици¬ровать часть памяти эта часть сначала явным образом копируется, чтобы гарантировать модификацию только в закрытой области па¬мяти. Следует также заметить, что память, используемая в режиме записи, совместному использованию не подлежит.
    Тем не менее вновь созданный процесс может делить со своим создателем часть других ресурсов, например открытые файлы. В Windows адресные пространства родительского и дочер¬него процессов различаются с самого начала.
    10.2. Завершение процесса
    После создания процесс начинает работать и выполняет свою задачу. Но ничто не длится вечно, даже процессы. Рано или поздно новые процессы будут завершены, обычно в силу следую¬щих обстоятельств:
    • обычного выхода (добровольно);
    • выхода при возникновении ошибки (добровольно);
    • возникновения фатальной ошибки (принудительно);
    • уничтожения другим процессом (принудительно).
    Большинство процессов завершаются по окончании своей работы. Когда компилятор откомпилирует заданную ему про¬грамму, он осуществляет системный вызов, сообщающий операци¬онной системе о завершении своей работы. Этим вызовом в UNIX является exit, а в Windows — ExitProcess. Программы, работающие с экраном, также поддерживают добровольное завершение. Тексто¬вые процессоры, интернет-браузеры и аналогичные программы все¬гда содержат значок или пункт меню, на котором пользователь мо¬жет щелкнуть, чтобы приказать процессу удалить все временные файлы, которые им были открыты, и завершить свою работу.
    Вторая причина завершения — обнаружение процессом фа¬тальной ошибки. Например, если пользователь наберет команду
    cc foo.c
    с целью компиляции программы foo.c, а файла с таким именем не будет, то произойдет простое объявление о наличии данного факта и выход из компилятора. Выхода из интерактивных, использующих экран процессов при задании им неверных параметров обычно не происходит. Вместо этого появляется диалоговое окно с просьбой о повторной попытке ввода параметров.
    Третья причина завершения — ошибка, вызванная самим процессом, чаще всего связанная с ошибкой в программе. В каче¬стве примеров можно привести неверную инструкцию, ссылку на несуществующий адрес памяти или деление на нуль. В некоторых системах (например, UNIX) процесс может сообщить операцион¬ной системе о своем намерении обработать конкретные ошибки самостоятельно, в таком случае, когда встречается одна из таких ошибок, процесс получает сигнал (прерывается), а не завершается.
    Четвертая причина, из-за которой процесс может быть за¬вершен, — это выполнение процессом системного вызова, прика¬зывающего операционной системе завершить некоторые другие процессы. В UNIX этот вызов называется kill. Соответствующая функция Win32 называется TerminateProcess. В обоих случаях у процесса, вызывающего завершение, должны быть на это соответ¬ствующие полномочия. В некоторых системах при добровольном или принудительном завершении процесса тут же завершаются и все созданные им процессы. Но ни UNIX, ни Windows так не делают.

Оставить комментарий

avatar
  Подписаться  
Уведомление о