ЗАНЯТИЕ 12. «Процессы»

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

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

Теперь рассмотрим персональный компьютер. При запуске системы запускается множество процессов, о которых пользователь зачастую даже и не подозревает. Например, может быть запущен процесс, ожидающий входящей электронной почты. Другой запу­щенный процесс может принадлежать антивирусной программе и предназначаться для периодической проверки доступности опреде­лений каких-нибудь новых вирусов. В дополнение к этому могут быть запущены процессы, инициированные пользователем в явном виде, — печать файлов или сброс пользовательских фотографий на USB-накопитель, и все они работают одновременно с браузером, с помощью которого пользователь просматривает Интернет. Всей этой работой нужно управлять, и здесь нам очень пригодится мно­гозадачная система, поддерживающая работу нескольких процес­сов.

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

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

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

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

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

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

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

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