![]() | |
|
Главная Радио и связь бальная. И наконец, если нам необходимо создать полную имитацию Ада-пакета и скрыть структуру стековых данных внутри стекового пакета, то мы придем к подходу, отображенному на рис. 2.5, в, который в Паскале недопустим. Все процедуры в Паскале обладают свойством повторной входимости, вследствие чего любые локальные структуры данных уничтожаются после возврата в вызывающую программу. Невозможно, таким образом, обеспечить сохранность элементов, помещенных в стек, до следующего вызова той же процедуры. Проницательный читатель, наверно, заметит, что рис. 2.5, б для некоторых ситуаций в точности удовлетворяет требованиям, предъявляемым к стеку. Изображенный на этом рисунке стековый пакет представляет собой процедуру в чистом виде, работающую на соответствующих глобальных данных. Именно так работают аппаратные стеки процессора, но, хотя это наблюдение и верно, оно не имеет отношения к делу, поскольку в стандартном Паскале невозможно скрыть данные внутри пакета, а Как раз это требуется во многих случаях. 2.2.2. Механизм рандеву Рассмотрим теперь еще одну относящуюся к процессу проектирования отличительную особенность языка Ада: механизм рандеву для задач, обеспечивающий их параллельное выполнение. Такая возможность может потребоваться для эффективного использования многопроцессорной системы, однако даже в случае однопроцессорной конфигурации задачи оказываются естественными моделями ситуаций во многих реальных приложениях. Читатель, знакомый с другими языками параллельного программирования, в которых операционными системами реализуется многозадачный режим, может заинтересоваться, насколько .термин задача в языке Ада эквивалентен аналогичному термину в этих средах или используемому в них термину процесс. Ответ состоит в том, что Ада-задачи обладают одним дополнительным совершенно уникальным свойством, а именно: они предоставляют пользователю процедурный интерфейс, полностью аналогичный интерфейсу, который обеспечивается пакетом. Задачи могут иметь входы для обращений из других задач, и эти входы должны описываться в спецификации задачи точно так же, как пакетные процедуры - в спецификации пакета. Хотя обращения и к входам, и к процедурам происходят одинаково, они определяются и реализуются по-разному. Обращения к процедурам выполняются вызывающей программой, а к входам ~- вызываемой (принимающей)! программой; в по- ![]() Траяиционньй подход. следнем случае вызывающая программа ждет своей очереди в течение так называемого рандеву. Таким образом, если рассматривать задачи с входами как черные ящики, то в качестве системных объектов они аналогичны пакетам с видимыми процедурами. Это позволяет экономнее вводить новые понятия в системном проектировании. Стандартные языки, такие, как Фортран, обычный Паскаль и многие другие, не предоставляют возможностей для организации многозадачной работы. В тех случаях, когда это требуется, гакой рел<им должна обеспечивать базовая многозадачная операционная система. При этом программы на языке высокого уровня выполняются как прикладные программы, которые по мере необходимости обращаются к операционной системе для межзадачной синхронизации и установления связей. Обращения к операционной системе и механизмы межзадачных связей лежат вне языка высокого уровня. Этот подход проиллюстрирован на рис. 2,6, а. Его основная трудность заключается в логической СЛОЖНОСТИ, поскольку нет единой концептуальной модели для системы в целом, включающей набор прикладных программ и операционную систему. Что касается языка Ада, то он предоставляет пользователю целостный механизм организации концептуально согласованной мел<задачной связи, не основанный на явных обращениях к базовой операционной системе и реализованный исключительно в рамках языка высокого уровня. Как показано на рис. 2.6, б, для этого требуется только базовое ядро, обеспечивающее механизм рандеву. Это базовое ядро невидимо на уров- ![]() \6) Подход ейзыке Ада. Рис. 2.6. Традиционный и реализованный в языке Ада подходы к организации прохождения задач. не Ада-программы. В действительности возможности, обеспечиваемые ядром, имеются в любой универсальной многозадачной операционной системе и могут использоваться так, как показано на рис. 2.6, а; при этом на уровне Ада-программы воздействие операционной системы неощутимо, по крайней мере в принципе. На самом деле первые реализации Ада-программ ЗАДАЧА-ПРОИЗВОДИТЕЛЬ Вызов: BUFFER. WRITE(CHARi Символ БУФЕРИЗУЮЩАЯ ЗАДАЧА 4>ч ![]() Вызов; BUFFER, READlCHAR) Рис. 2.7. Основная форма структурного отображения системы с производящей, потребляющей и буферизующей задачами (графическая нотация гл. 3 используется неполностью), Придется выполнять именно описанным способом. Ясно, что такой подход, предполагающий функционирование сложных языковых средств на основе сложной операционной системы, в общем случае нежелателен и пригоден только как временная мера. Эффективные реализации Ада-программ должны основываться на минимальном ядре или непосредственно на аппаратных средствах, обеспечивающих поддержку механизма рандеву. Для иллюстрации природы межзадачных связей и использования механизма рандеву рассмотрим пример на рис. 2.7, где показаны взаимодействия между задачей-производителем, буферизующей задачей и задачей-потребителем. Эти задачи изо-бралсены в виде черных ящиков и немного напоминают пакеты, за тем исключением, что представлены параллелограммами, а не прямоугольниками, чтобы в символическом отображении подчеркнуть их параллельную природу. На рисунке задача-производитель и задача-потребитель автономны и не имеют входов. Напротив, буферизующая задача имеет входы записи и чтения, которые используются двумя другими задачами. Идея состоит в том, что буферизующая задача сглаживает расхождения между скоростью вывода в задаче-производителе и скоростью ввода, свойственной задаче-потребителю. Проницательный читатель может спросить: «Почему бы не использовать пакет? Для чего нужна задача?» Ответ состоит в том, что в про- 0 1 2 3 4 5 6 7 8 9 [ 10 ] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 0.0095 |