На сайте появилась еще одна
статья Б.П. Кузнецова: Распределенные
конечные автоматы. Новая
автоматная модель, на этот раз
обеспечивающая описание
параллелизма. При этом непривычная
для меня ортогональная трактовка
механизма распараллеливания, что
привела к следующим образным
ассоциациям.
Существует несколько способов
нарезки батона на бутерброды. Можно
его порезать по вертикали или
диагонали, вдоль или поперек. Можно
сделать один разрез по горизонтали
и наложить между двух половинок
колбасу. Все зависит от специфики
рта, количества ртов, размера
батона и многих других факторов.
Примерно такая же ситуация
постоянно наблюдается и в
программировании. Появление новых
языков, моделей и методов во многом
связано с попытками сделать
специфический надрез, более
эффективно отражающий особенности
решаемой задачи. Один из таких "батонов"
определяет специфику построения
параллельных программ.
Занимаясь параллельной
обработкой, я достаточно устойчиво
зафиксировал, что наиболее
типичной ситуацией для автоматных
моделей является "вертикальное
разрезание", при которой имеем
множество одновременно работающих
независимых автоматов, каждый из
которых обладает своим множеством
состояний. Изредка эти автоматы
обмениваются между собой
информацией, которая может
использоваться как для обработки
данных, так и для выполнения
переходов.
И вот моим усыхающим мозгам
подается новая трактовка.
Оказывается, автомат можно "разрезать
на горизонтальные слои", каждый
из которых имеет одни и те же
состояния. Эти состояния
определяют единый мультипереход и
одновременную множественную
обработку. Конечно, и в таком
автомате возникают конфликтные
ситуации, требующие специального
арбитража, но это - проблема почти
всех моделей параллельных
вычислений. Чем интересно такое
распределение процессов? Основным
достоинством является
одинаковость состояний. Кроме
этого, если один автомат является
ведущим, то за него можно "зацепить"
несколько ведомых. Кроме этого,
горизонтальное разрезание можно
объединять с вертикальным, что
позволяет комбинировать различные
стратегии управления
параллельными вычилсениями,
описывая их при этом еще на уровне
модели.
Естественно, что в голове
возникли различные аналогии. Одна
из них связана с известным всем
образцом: "Модель-Вид-Контроллер".
В данной ситуации роль модели
выполняет автомат, занимающийся
непосредственным управлением.
Рассматриваемая в статье
операторская станция действует как
вид. Она может быть расширена
активными состояниями, что
позволяет не просто просматривать
изображения, но и осуществлять
функции операторского управления.
Однако, имеется и отличие. Оно
заключается в том, что механизм
уведомления, задаваемый
контроллером, явно не прописан.
Следовательно, он может быть любым.
Используя одну версию этого
механизма, можно жестко
упорядочить работу автоматов,
получив чисто последовательное
исполнение. Другие варианты
позволяют получить параллельное
функционирование,
синхронизируемое на идентичных
состояниях.
Существует ли алгоритмическая
модель, эквивалентная
распределенным конечным автоматам?
На мой взгляд, наиболее близким
аналогом являются ярусно-параллельные
формы (ЯПФ), известные с
незапамятных времен. Обычно они,
чаще всего, использовались в
линейной трактовке, определяя
механизм синхронизации. Вместе с
тем, после выполнения вычислений, в
каждом из ярусов, или в некоторых из
них могут быть заданы условные
переходы на следующие ярусы, а
арбитр выбирает тот ярус, на
который действительно последует
переход. В отличие от ярусно-праллельной
формы, модель распределенных
конечных автоматов
непосредственно осуществляет
дополнительное распределение
процессов по отдельным ресурсам. В
ЯПФ такое разделение надо
проводить явной разметкой после
каждой точки синхронизации.
Надеюсь, что и у Вас возникнут
свои полезные ассоциации, которые
помогут повысить эффективность
программирования.