Одним из способов, позволяющих понять важность концепции "задачи" как в системных, так и в прикладных программах, является представление задачи как некоторой абстракции вычислительной машины. По аналогии с рассмотрением и созданием реальных систем как ансамблей взаимодействующих физических машин программные системы могут быть созданы и представлены в виде взаимодействующих абстрактных машин. Роли, играемые задачами в программах, за небольшим исключением (обсуждаемым ниже), совпадают с ролями, играемыми машинами в реальных системах, подобных фабрикам, учреждениям и сетям ЭВМ.
Представим, например, рабочие станции на фабрике как сеть таких машин. Поток материалов направляется по заранее установленным путям между рабочими станциями. Пути и станции могут быть промоделированы как дуги и вершины направленного графа. Некоторые секции направленного графа, в которых в одной ветви последовательно расположено несколько рабочих станций, образуют рабочий "конвейер".
Параллелизм и, следовательно, повышенная производительность достигаются в конвейере в том случае, если станции Е, F, G, ... в состоянии выполнять соответствующие операции над единицами заданий за то же самое время.
Другие участки графа, в которых поток разветвляется от одной станции к нескольким, образуют параллельный обрабатывающийся поток:
Параллелизм и, следовательно, повышенная производительность достигаются в этом случае при том условии, что станции I, J, К, ... могут быть заняты обработкой независимых исходных материалов, поступающих со станции D.
Станция D представляет собой распределитель заданий. (Для D существуют два нетривиальных особых случая: а) D не распределяет задания ни одной из станций; б) D распределяет задания только для одной станции.)
Другая станция С может служить коллектором заданий (она может также рассматриваться как арбитратор или синхронизатор):
Несмотря на то что наши диаграммы предполагают распространение потока между сообщающимися станциями только в одном направлении, для некоторых видов заданий (т. е. типов обрабатываемых данных) поток может распространяться и в обратном направлении. Помимо этого, для каждой направленной дуги, изображающей рабочий поток (или поток данных), имеется, хотя и не обязательно в явном виде, несколько управляющих дуг для управления потоком данных, таких, как дуга запроса и дуга подтверждения.
Перечисленные наблюдения позволяют нам идентифицировать четыре возможных различных состояния среди связанных между собой рабочих станций, а именно конвейер, параллельная обработка, распределение и сбор (арбитраж). В соответствии с этим индивидуальные рабочие станции (также задачи в языке Ада) могут выступать в одной из четырех возможных ролей:
В более абстрактном смысле рабочая станция С, принимающая задания, делает это для оказания услуги по отношению к некоторой рабочей станции R, посылающей данное задание. Следовательно, мы можем трактовать С и R как соответственно обслуживателя и запросчика. Обратившись к предыдущим структурным диаграммам, мы можем заметить, что элемент конвейера, например рабочая станция F, является одновременно и запросчиком, и обслуживателем, в то время как рабочая станция D является только запросчиком, а станция С - только обслуживателем.
Из всего сказанного вытекает важная рекомендация, предлагающая рассматривать задачи на языке Ада точно так же, как это делается по отношению к вычислительным машинам в целом. Следовательно, задачи могут рассматриваться как передатчики сообщений к другим задачам подобно потокам заданий (или данных) между машинами или рабочими станциями. В общем случае поток информации может распространяться в обоих направлениях. Запрос от задачи Т1 к задаче Т2 может включать в себя как передаваемую, так и принимаемую информацию по аналогии с режимами параметров in, in out и out для процедурного вызова Р2 из Р1.
Преимущества параллельной обработки, присущие машинным ансамблям реальных систем, приложимы также и к программам. Абстрактная возможность параллельной работы программной структуры в языке Ада отделена от фактически достигаемого параллелизма, являющегося функцией от числа процессоров. Таким образом, программа на языке Ада, представляющая собой набор из т задач и выполняющаяся на ЭВМ общего назначения, имеющей п процессоров, может иметь до min(т, п) параллельно работающих задач.
"Прозрачная" многопроцессная обработка в архитектуре i432, описанная в гл. 5, обеспечивает в диапазоне п (где {п<=т}) при возрастании или убывании п соответственно линейное (приблизительное) увеличение или уменьшение параллелизма работы, разумеется, без каких-либо изменений в самой программе. Возможность обеспечения параллелизма подобным способом является главной причиной перестройки важнейших алгоритмов, которые до последнего времени реализовывались только в виде чисто последовательных вычислений.
Задача в языке Ада по своим возможностям существенно мощнее реальной машины, поскольку последняя не в состоянии сама создавать другие реальные машины. Задача в языке Ада, обладая уровнем управления, недоступным реальным машинам, может непосредственно вызвать создание (запуск) и разрушение других задач. Этот новый уровень управления дает возможность задаче Т породить набор из п дочерних задач С1, С2, . . . Сп, переводя каждую из них в активное состояние. В таких условиях задача Т может при необходимости функционировать как запросчик служб от порожденных ею задач. Порожденные задачи могут в свою очередь также порождать другие задачи и функционировать как запросчики, обслуживатели или запросчики-обслуживатели.