Модель процесса
Все
программное обеспечение, в том числе и операционная система, представлены на
компьютере как набор процессов. С одной стороны, процесс представляет собой
абстракцию, описывающую работу задачи, а с другой стороны, это сама задача выполняющаяся
в определенное время и использующая такие ресурсы процессора, как: счетчик
команд, регистры и переменные. С точки зрения абстрактной модели, каждый
процесс имеет свой собственный виртуальный процессор. На самом деле процессор
переключается с одного процесса на другой, предоставляя им свои ресурсы. Это
явление называется многозадачность, а также мультипрограммирование, потому что
при переключении между процессами, процессор использует алгоритм планирования
для определения моментов переключения.
Для
реализации модели процесса операционная система содержит массив технологических
структур с одним элементом для каждого процесса. Этот элемент называется
дескриптором процесса, который содержит информацию о состоянии процесса и его
параметрах.
Таким
образом, модель процесса ориентирована в двух направлениях:
1) выполнение
задачи;
2)
объединение ресурсов.
Каждому
процессу выделяется виртуальная адресная область операционной системой, которая
представляет собой набор виртуальных адресов, необходимых для запуска процесса.
Операции
данных, такие как чтение или запись, происходят в адресном пространстве.
Каждый
процесс связан с набором регистров, таких как указатель стека или счетчик
команд, который содержит адрес следующей команды в очереди. После того, как
команда выбрана из памяти, счетчик команды корректируется счетчиком сдвига и
указатель перемещается к следующей команде.
Рассмотрим
компьютер, который является многозадачным и имеет четыре программы в памяти.
На графике
показано, что одновременно активен только один процесс. Ниже приведены
параллельные процессы, каждый со своим счетчиком команды.
Но на самом
деле есть только один физический счетчик команд, в который загружается
логический командный счетчик текущего процесса. Когда время, отведенное
текущему процессу, заканчивается, физический счетчик команд хранится в памяти,
в логическом счетчике команд процесса.
Условно можно
считать, что есть только один центральный процессор. Хотя все больше таких
предположений противоречат истине, так как новые кристаллы часто являются
многоядерными, имея два, четыре и более ядра. Поэтому, когда мы говорим, что
процессор на самом деле способен работать только с одним процессом в данный
момент времени, то, если он имеет два ядра (или процессоров), на каждом из них
в данный момент времени может работать только один процесс.
Поскольку
процессор переключается между процессами, скорость выполнения процесса не будет
одинаковой и, скорее всего, не сможет быть показана снова, если тот же процесс
будет запущен вновь. Поэтому процессы не должны программироваться, ориентируясь
на жёсткое время выполнения. Рассмотрим, например, аудиопроцесс, который
воспроизводит музыку для сопровождения высококачественного видео, работающего
на другом устройстве.
Так как звук
может быть запущен немного позже, чем видео, аудиопроцесс даёт сигналы видеосерверу,
чтобы тот начинал воспроизведение, а затем перед проигрыванием аудио запускает
холостой цикл 10 000 раз. Если цикл служит надежным таймером, то все пойдет как
следует, но если процессор решит переключиться на другой процесс во время холостого
цикла, аудиопроцесс может возобновиться, когда соответствующие кадры уже
показаны, и, к сожалению, синхронизация видео и аудио будет сбита. Когда
процесс имеет такие требования в реальном времени, критически важные для его
работы, конкретные события должны происходить после определенного количества
миллисекунд, и для их возникновения должны быть приняты специальные меры. Но,
как правило, на большинство процессов не влияет установленный режим
многозадачности процессора или относительная скорость выполнения различных
процессов.
Разница между
процессом и программой довольно тонкая, но очень значительная. Здесь, наверное,
нам поможет какая-то аналогия. Представьте себе программиста, который решил
приготовить еду и испечь торт ко дню рождения дочери. У него есть рецепт
пирога, и на кухне есть все ингредиенты: мука, яйца, сахар, ванильный экстракт
и т.д. В этой аналогии рецепт представляет собой программу (то есть алгоритм,
выраженный в удобной форме записи), программист является центральным процессором,
а ингредиенты пирога – это входные данные. Процесс представляет собой действие,
состоящее из чтения рецепта нашего повара, выбора ингредиентов и выпечки торта.
А теперь
представьте, что сын программиста бежит на кухню и кричит, что его ужалила пчела.
Программист записывает, в какой момент рецепта он остановился (состояние
текущего процесса сохраняется), достает книгу советов для оказания первой
помощи и начинает выполнять инструкции, изложенные в ней. Мы видим процессор,
который перешел от одного процесса (выпечка) к другому процессу с более высокой
степенью приоритета (медицинское обслуживание), и каждый из процессов имеет
свою собственную программу (рецепт против справочника первой помощи). После
удаления жала пчелы, программист возвращается к пирогу, продолжая выполнять
действия, на которых он остановился.
Ключевая идея
здесь заключается в том, что процесс является своего рода действием. Он имеет
программу, вход и выход, и состояние. Один процессор может быть общим для
нескольких процессов в соответствии с алгоритмом планирования, который
используется для определения того, когда остановить один процесс и обслуживать
другой. В отличие от процесса, программа может быть сохранена на диске и не
должна ничего делать вообще.
Стоит
отметить, что, если программа запущена дважды, считается, что она занята двумя
процессами. Например, часто можно запустить текстовый процессор дважды или
распечатать два файла одновременно, если два принтера доступны одновременно.
Тот факт, что два запущенных процесса работают из одной и той же программы, не
учитывается, поскольку они представляют собой два разных процесса. Операционная
система может позволить им обмениваться кодом, так что будет только одна копия
этого кода в памяти, но это чисто техническая деталь, которая не меняет
концептуальной ситуации в отношении двух запущенных процессов.
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.