Т. Пратт, М. Зелковиц - Языки программирования - разработка и реализация (4-е издание_ 2002) (1160801), страница 135
Текст из файла (страница 135)
11.1. Различные варианты управления подпрограммами 491 Структуры управления, в которых подпрограммы могут вызываться и квк сопрограммы, и как обычные подпрограммы и в которых сопрограммы могут быть рекурсивными (то есть иметь несколько одновременно существующих активаций), требуют более сложной реализации. 11.1.3. Планируемые подпрограммы Концепция планирования подирогралям основывается на отказе от предположения, что подпрограмма всегда должна начинать свое выполнение непосредственно в точке вызова.
Оператор вызова обычной подпрограммы можно рассматривать как оператор, указывающий, что вызываемая подпрограмма дол1кна немедленно начать выполнение, без ожидания завершения выполнения вызываюгцей программы. При этом завершение выполнения вызывающей программы перепланируется на момент завершения вызванной подпрограммы. Структура управления обработки исключений также может рассматриваться как средство планирования подпрограмм. Обработчик исключения выполняется всякий раз, когда порождается определенное исключение. Продолжая делать обобщения, приходим к следующим возможным способам планирования подпрограмм. 1. Планировать выполнение подпрограмм следует таким образом, чтобы одна подпрограмма выполнялась до или после выполнения других подпрограмм, например, оператор са11 В а1тег Я мог бы означать, что выполнение подпрограммы В запланировано после завершения выполнения подпрограммы Я.
2. Планировать выполнение программ в зависимости от истинности какого- либо булеза выражения, например: са11 В наел Х = 5 апа 2 > 0 Такое планирование является одним из видов обобщенной обработки исключений; подпрограмма В вгязывается всякий раз, когда значения переменных у и Х изменяются и удовлетворяют заданным условиям. 3. Планировать подпрограммы на основе моделирования временной 1нкалы, например: са11 В ат шве = 25 ог са11 В ат Ыте - Ссггелтт1ае + 10 Это позволяет чередовать запланированные вызовы подпрограмм из разных источников. 4.
Планировать подпрограммы в соответствии с назначенным приоритетом, например, следующий оператор: са11 В н1ть ргчог1гу 7 активизировал бы подпрограмму В, если не запланирован вызов ни одной подпрограммы с более высоким приоритетом. Реализованные способы обобщенного планирования подпрограмм можно встретить только в языках моделирования дискретных систем, таких как ОРВИ, В1 МВСК1 РТ и о!МгЛ.Л, хотя перечисленные выше концепции имеют широкое применение. Каждый из описанных способов планирования подпрограмм встречается по мень- 492 Глава 11. Распределенная обработка данных шей мере в одном из перечисленных языков.
Наиболее важным методом, используемым при моделировании систем, является третий — планирование, основанное на моделировании временной шкалы. Этот способ планирования мы и рассмотрим несколько подробнее. Когда мы говорим о планировании подпрограмм, мы имеем в видупланирование активаций подпрограмм, поскольку это планирование относится ко времени выполнения программы, для которого может быть спланировано множество активаций одной и той же подпрограммы в разных точках. Планирование подпрограмм в наиболее общем смысле означает, что главная программа уже не пишется программистом, а является системной программой-нланирови1иком, и ее назначение заключается в том, чтобы поддерживать список текущих запланированных подпрограмм, упорядоченный в соответствии с последовательностью их вьшолнения. В языке предусматриваются операторы, которые позволяют вставлять активации подпрограмм в этот список во время выполнения.
Программа-планировщик вызывает подпрограммы в указанной последовательности. Когда заканчивается выполнение одной подпрограммы, инициируется выполнение следующей подпрограммы из этого списка. Обычно допускается и обычный вызов подпрограмм, иногда просто путем временной приостановки выполнения одной подпрограммы и немедленного выполнения другой.
В языках моделирования наиболее общий подход к планированию подпрограмм основывается на обобцгепной концепции сопрограммы. Выполнение активации одной подпрограммы состоит из набора активных и нассивных фаз. Во время активной фазы подпрограмма имеет управление и выполняется; во время пассивной фазы подпрограмма передает управление куда-то в другое место и ожидает возобновления своего выполнения. Но в данном случае сопрограмма передает управление другой сопрограмме не напрямую в момент перехода от активной к пассивной фазе — сначала управление возврап1ается программе-планировщику, которая затем уже передаст управление следующей подпрограмме из списка. Эта передача управления может принимать форму возобновления подпрограммы, если она уже была вызвана, а затем приостановлена, или инициирования совершенно новой активации подпрограммы.
Концепция планирования сопрограмм представляется чрезвычайно простой в случае моделирования временной шкалы. Предположим, что каждая активная фаза выполнения подпрограммы может быть спланирована таким образом, чтобы она начиналась в какой-либо точке целочисленной шкалы времени, начинающейся в момент времени Т = 0. Т вЂ” это целочисленная переменная, которая всегда содержит значение текущего времени на модели шкалы времени.
Выполнение активной фазы подпрограммы на этой шкале всегда происходит мгновенно (то есть значение переменной Т не меняется во время выполнения активной фазы подпрограммы). Когда активная фаза завершается и управление переходит к программе- планировщику, планировщик обновляет значение Т, присваивая этой перемешюй значение времени, соответствующее времени вызова следующей подпрограммы из списка планируемых подпрограмм, и передает управление атой подпрограмме. Вновь вызванная подпрограмма частично выполняется и возвращает управление планировщику, который снова обновляет значение Т и активизирует следующую подпрограмму из списка.
11.2. Параллельное программирование 483 11.2. Параллельное программирование Последнее ограничение, указанное в разделе 9.1, которое нам предстоит рассмотреть, заключается в том, что при выполнении программ существует'единственная последовательность выполнения. Вообще, несколько подпрограмм могут выполняться одновременно. Когда сугцествует единственная последовательность, программа называется последовательной программой, поскольку выполнен ис се подпрограмм происходит в заранее определенной последовательности. В более общем случае программа называег си паршшелыий программ ой.
Каждая подпрограмма, которая может выполняться параллельно с другими подпрограммами, называется заданы (или иногда процессом). До сих пор при обсуждении управления последовательностью действий мы предполагали, что при выполнении программы всегда существует некоторый предопределенный поток управления, описываю~ций выполнение программы. Это хорошо согласуется с неймановской архитектурой, которую мы предполагали для нашего реального компьютера. Тем не менее в программировании параллельные вычисления также играют важную роль. В настоящее время достаточно широко используются компьютерные системы, допускающие параллельное программирование.
В мультипроцессорной системе имеется несколько центральных процессоров, которые совместно используют общую память. В распределенной нли параллельной компьютерной системе имеется несколько компьютеров (возможно, несколько десятков или сотен), у каждого из которых есть своя память и свой центральный процессор, причем все эти компьютеры при помощи линий связи объединены в одну сеть, через которую они могут взаимодействовать друг с другоьс В таких системах одновременно может выполняться множеспю задач. Даже если программа выполняется на одном компьютере, часто бывает полезно разработать ее таким образом, чтобы она состояла из нескольких отдельных задач, одновременно выполняющихся на виртуальном компьютере, хотя реально на физическом компьютере в каждый момент времени может выполняться только одна задача.
Иллюзия параллельного выполнения в случае одного процессора достигается за счет чередования выполнения отдельных задач так, что каждая из них выполняет часть своего кода, после чего процессор переключается на выполнение другой задачи, которая также выполняет только часть своего кода и т. д. Операционные системы, которые поддерживаютмультипрограммировапие и режим разделения времени, предоставляют именно такой способ одновременного'выполнения нескольких пользовательских программ.
Но в нашей книге мы будем иметь дело с параллельным выполнением задач в пределах одной программы. Основным камнем преткновения является то, что в языках программирования отсутствуют конструкции для построения таких систем. По большей части при использовании таких стандартных языков, как С, приходится обращаться к дополнительным функциям операционной системы, чтобы реализовать параллельные задачи. Но ситуацию можно исправить, если разработать ссютветствующий язык программирования. Принципы разработки языков параллельного программирования Конструкции параллельного программирования усложняют разработку языка, поскольку одновременно несколько процессоров могут иметь доступ к одному и то- 494 Глава 11. Распределенная обработка данных муже вавил б) Они могут быть реагируюгцилги, когда программа реагирует на некоторые ннешние «раздражители», называемые событиями.
Примерами реагирующих систем являются системы реального времени и оперативные системы управления. Операционная система и система обработки транзакций, например система регистрации предварительных заказов, также являются типичными примерами таких реагирующих систем. В целом их можно охарактеризовать как обладающие недетермипироваппым поведением, так как никогда не известно точно, когда произойдет какое-то событие.