Принципы разработки сложных программных продуктов комплексов постоянно эволюционируют и совершенствуются. Объектно-ориентированный подход является неотъемлемой частью и главной методологией проектирования программных систем в настоящее время. Существующие сейчас библиотеки параллельного программирования, такие как, написанная на C и Fortran, MPI или, например, NESL, Charm++ и т.д. очень низкоуровневые, ориентированные только на процедурную или функциональную модель программирования и, таким образом, не совместимы с современным объектно-ориентированным стилем проектирования приложений.
Основными целями Spring PPI являются: Spring PPI написана на C# и реализована в виде 2-х составляющих: фреймворка параллельного программирования и Run-time системы. Фреймворк предоставляет программисту интерфейс для создания параллельных приложений. Используя интерфейс фреймворка, программист взаимодействует с Run-time системой, которая обеспечивает корректное выполнение удаленных методов на узлах кластера и поддерживает функционирование каналов, как средства обмена сообщениями между удаленными методами. Паттерн представляет собой «высококачественное решение часто встречающейся проблемы при проектировании в определенной предметной области» [1]. Так как проектирование параллельных программ очень трудоемкий и сложный процесс. Необходима разработка методологии, позволяющей упростить и повысить надежность, понятность параллельных приложений[2]. Фреймворк Spring PPI позволяет программисту разрабатывать параллельные приложения, опираясь исключительно на паттерн - ориентированный подход к проектированию.
Spring PPI реализует работу со следующими паттернами параллельного проектирования:
2.Паттерн Pipeline применяется, когда «задача может быть разделена на последовательность задач, связанных зависимостью при использовании данных»[3]. 3. Паттерн Master-Slave[3] реализует отношение между удаленными методами «главный-подчиненный». Схема работы паттерна следующая: существует главный процесс – Master и несколько подчиненных процессов - Slaves. В Spring PPI паттерн реализован так, что главный процесс может взаимодействовать с подчиненными путем посылки сообщений разного типа. Каждый подчиненный процесс для каждого типа сообщения имеет соответствующий обработчик. Таким образом, взаимодействие между главным и подчиненными процессами можно сравнить с механизмом генерации и обработки событий. 4. Паттерн Divide and Conquer[4](«Разделяй и властвуй») в Spring PPI может описывать сложную древовидную иерархию задач (Singleton’ов). Задачи в дереве связаны отношением «родитель-потомок» («parent-child»). Каждый «родитель» может иметь несколько «потомков» и, что очень важно, каждый «потомок» может иметь несколько «родителей». Общее правило функционирования паттерна таково, что каждый «потомок» запускается автоматически только тогда, когда каждый его «родитель» завершил работу. 5. Repository[4] («хранилище») - паттерн описывающий логику работы процессов (удаленных методов) с общей памятью. Для доступа к хранилищу используется класс SharedMemory. Все хранилище разбивается на ячейки (cells), каждая ячейка имеет свой уникальный идентификатор (ID) строкового типа. В ячейке может храниться объект любого типа - от булевого типа до сложной иерархии разнотипных объектов. Процесс записи и чтения данных из ячейки основан на механизме сериализации. В качестве демонстрации работоспособности и эффективности предложенной модели параллелизма основанного на паттернах, с помощью интерфейса Spring PPI были реализованы классические алгоритмы параллельного умножения матриц: Фокса, Кеннона и ленточный. При проведении тестов все три алгоритма показали достаточно высокий уровень масштабируемости, что говорит о масштабируемости самой Run-time системы Spring PPI.
Литература |