Создание процесса. Завершение процесса

Модель процесса

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

Различие между процессом и программой трудноуловимо и тем не менее име­ет принципиальное значение. Воспользуемся следующей аналогией: представьте себе программиста, разбирающегося в кулинарии и пекущего торт на день рожде­ния своей дочери. В его распоряжении есть рецепт торта, кухня, оборудованная всем необходимым, и ингредиенты для торта: мука, яйца, сахар, ванилин и т. п. Согласно этой аналогии, рецепт — это программа (то есть алгоритм, записанный в заданном виде), программист исполняет роль процессора, а ингредиенты торта являются входными данными. Процессом является следующая последователь­ность действий: программист читает рецепт, смешивает продукты и нечет торт.

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

Мы привели эту аналогию с целью показать, что процесс — это активность не­которого рода. У него есть программа, входные и выходные данные, а также состо­яние. Один процессор может переключаться между различными процессами, ис­пользуя некий алгоритм планирования для определения момента переключения от одного процесса к другому.

Создание процесса. Завершение процесса.

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

Инициализация системы.

Выполнение изданного работающим процессом системного запроса на созда­ние процесса.

Запрос пользователя на создание процесса.

Инициирование пакетного задания.

Обычно при загрузке операционной системы создаются несколько процессов. Некоторые из них являются высокоприоритетными процессами, то есть обес­печивающими взаимодействие с пользователем и выполняющими заданную ра­боту. Остальные процессы являются фоновыми, они не связаны с конкретными пользователями, но выполняют особые функции. Например, один фоновый про­цесс может быть предназначен для обработки приходящей на компьютер почты, активизируясь только по мере появления писем. Фоновые процессы, связан­ные с электронной почтой, web-страницами, новостями, выводом на печать и т. п., называются демонами. В UNIX для вывода списка запущенных процессов используется программа ps. В Windows 95/98/Ме достаточно нажать CTRL-ALT-DEL. Процессы могут создаваться не только в момент загрузки системы, но и позже. Например, новый процесс (или несколько) может быть создан по просьбе текуще­го процесса. Создание новых процессов особенно полезно в тех случаях, когда вы­полняемую задачу проще всего сформировать как набор связанных, но тем не ме­нее независимых взаимодействующих процессов. В UNIX существует только один системный запрос, направленный на создание нового процесса: fork (ветвление или вилка). Этот запрос создает дубликат вызы­ваемого процесса. После выполнения запроса fork двум процессам — родитель­скому и дочернему — соответствуют одинаковые образы памяти, строки окружения и одни и те же открытые файлы. Обычно дочерний процесс выполняет системный вызов execve (или похожий) для изменения своего образа памяти и запуска новой программы. И в UNIX, и в Windows после создания нового процесса родительский и дочер­ний процессы имеют собственные различные адресные пространства. В UNIX начальное адресное пространство дочернего про­цесса является копией родительского, но сами адресные пространства различны, и перезаписываемая память совместно не используется.

После того как процесс создан, он начинает выполнять свою работу. Но ничто не длится вечно, даже процесс — рано или поздно он завершится, чаще всего благо­даря одному из следующих событий:

Обычный выход (преднамеренно).

Выход по ошибке (преднамеренно).

Выход по неисправимой ошибке (непреднамеренно).

Уничтожение другим процессом (непреднамеренно).

В основном процессы завершаются по мере выполнения своей работы. После окончания компиляции программы компилятор выполняет системный запрос, чтобы сообщить операционной системе об окончании работы. В UNIX этот сис­темный запрос — exit, а в Windows — ExitProcess.

Второй причиной завершения процесса может стать неустранимая ошибка. Например, если пользователь набрал на клавиатуре команду

сс foo.c

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

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

Четвертой причиной завершения процесса может служить выполнение другим процессом системного запроса на уничтожение процесса. В UNIX такой системный запрос — kill, а соответствующая функция Win32 — TerminateProcess. В обоих слу­чаях «киллер» должен обладать соответствующими полномочиями по отношению к «убиваемому» процессу.

Наши рекомендации