Основным понятием в любой операционной системе является процесс: абстракция, описывающая выполняющуюся программу. Все остальное зависит от этого понятия, поэтому крайне важно, чтобы студенты получили полное представление о концепции процесса как можно раньше. Процессы — это одна из самых старых и наиболее важных абстракций, присущих операционной системе. Они поддерживают возможность осуществления (псевдо) параллельных операций даже при наличии всего одного центрального процессора. Они превращают один центральный процессор в несколько виртуальных. Без абстракции процессов современные вычисления просто не могут существовать.
Современные компьютеры, как правило, заняты сразу несколькими делами. Возможно, люди, привыкшие к работе с компьютерами, не до конца осознают этот факт, поэтому рассмотрим ряд примеров. Сначала представим себе веб-сервер. К нему отовсюду приходят запросы, требующие предоставления веб-страниц. Когда приходит запрос, сервер проверяет, нет ли нужной страницы в кэше. Если она там присутствует, он отправляет эту страницу; если ее там нет, осуществляется запрос к диску для ее извлечения. Но с точки зрения центрального процессора запрос информации с диска занимает целую вечность. За время ожидания результатов запроса информации с диска может поступить множество других запросов. Если в системе установлено несколько дисков, то некоторые из новых запросов или все они могут быть направлены на другие диски задолго до того, как будет удовлетворен первый запрос. Понятно, что нужен какой-нибудь способ, чтобы смоделировать эту параллельную работу и управлять ею. Справиться с этим помогают процессы (и особенно потоки).
Теперь рассмотрим персональный компьютер. При запуске системы запускается множество процессов, о которых пользователь зачастую даже и не подозревает. Например, может быть запущен процесс, ожидающий входящей электронной почты. Другой запущенный процесс может принадлежать антивирусной программе и предназначаться для периодической проверки доступности определений каких-нибудь новых вирусов. В дополнение к этому могут быть запущены процессы, инициированные пользователем в явном виде, — печать файлов или сброс пользовательских фотографий на USB-накопитель, и все они работают одновременно с браузером, с помощью которого пользователь просматривает Интернет. Всей этой работой нужно управлять, и здесь нам очень пригодится многозадачная система, поддерживающая работу нескольких процессов.
В любой многозадачной системе центральный процессор быстро переключается между процессами, предоставляя каждому из них десятки или сотни миллисекунд. При этом хотя в каждый конкретный момент времени центральный процессор работает только с одним процессом, в течение 1 секунды он может успеть поработать с несколькими из них, создавая иллюзию параллельной работы. Иногда в этом случае говорят о псевдопараллелизме в отличие от настоящего аппаратного параллелизма в многопроцессорных системах (у которых имеется не менее двух центральных процессоров, использующих одну и ту же физическую память). Людям довольно трудно отслеживать несколько действий, происходящих параллельно. Поэтому разработчики операционных систем за прошедшие годы создали концептуальную модель последовательных процессов, упрощающую работу с параллельными вычислениями.
9.1 Модель процесса
В этой модели все выполняемое на компьютере программное обеспечение, иногда включая операционную систему, сведено к ряду последовательных процессов, или, для краткости, просто процессов. Процесс — это просто экземпляр выполняемой программы, включая текущие значения счетчика команд, регистров и переменных. Концептуально у каждого процесса есть свой, виртуальный, центральный процессор. Разумеется, на самом деле настоящий центральный процессор постоянно переключается между процессами, но чтобы понять систему, куда проще думать о наборе процессов, запущенных в (псевдо) параллельном режиме, чем пытаться отслеживать, как центральный процессор переключается между программами. Это постоянное переключение между процессами, это называется мультипрограммированием, или многозадачным режимом работы.
На рис. 32, а показан компьютер, работающий в многозадачном режиме и имеющий в памяти четыре программы. На рис. 32, б показаны четыре процесса, каждый из которых имеет собственный алгоритм управления (то есть собственный логический счетчик команд) и работает независимо от всех остальных. Понятно, что на самом деле имеется только один физический счетчик команд, поэтому при запуске каждого процесса его логический счетчик команд загружается в реальный счетчик. Когда работа с процессом будет на некоторое время прекращена, значение физического счетчика команд сохраняется в логическом счетчике команд, размещаемом процессом в памяти. На рис. 32, в показано, что за довольно длительный период наблюдения продвинулись вперед все процессы, но в каждый отдельно взятый момент времени реально работает только один процесс.

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

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