Journal influence
Bookmark
Next issue
Abstract:
Аннотация:
Authors: () - , () - | |
Page views: 12576 |
Print version Full issue in PDF (2.00Mb) |
Использование объектно-ориентированного подхода при разработке больших и сложных программных систем несет в себе много преимуществ, из которых в числе наиболее важных – расширяемость и возможность повторного использования кода. Объектно-ориентированная модель также вполне подходит для моделирования систем с параллельными процессами. Однако при этом поддержка расширяемости и возможности повторного использования кода становится далеко не тривиальной. Вдобавок традиционные методологии объектно-ориентированного программирования уделяют недостаточно внимания анализу и проектированию условий синхронизации параллельных объектов. Данная работа представляет расширение T# платформы .NET, реализующее концепцию автоматического динамического распараллеливания программ. Расширение скрывает низкоуровневые детали организации параллельных вызовов, распределения нагрузки и размещения объектов на узлах кластера от программиста. При этом поддерживается привычная объектно-ориентированная семантика C#. Эти свойства позволяют существенно повысить производительность программиста и в создании новых параллельных программ, и в миграции существующих последовательных программ на параллельную архитектуру. Все современные технологии распараллеливания призваны автоматизировать переход от программы, записанной на языке, удобном для человека, к параллельному алгоритму, который при соответствующей аппаратной поддержке позволяет получить выигрыш в производительности по сравнению с последовательным выполнением аналогичной программы на однопроцессорном компьютере. Различные подходы к решению этой задачи разнятся своими ключевыми идеями, которые в совокупности и обусловливают сильные и слабые стороны каждой технологии, и, как следствие, имеют ту или иную область своего эффективного применения. В данной работе рассматривается подход автоматического динамического распараллеливания программ, обладающий определенными свойствами. Организация параллельных вызовов: предлагается объектно-ориентированное расширение концепции процесса. Данная концепция хорошо согласуется с объектно-ориентированной парадигмой, при которой в программе есть набор четко определенных задач. Параллелизм инициируется в рамках вызовов параллельных методов.
Средствами синхронизации выступают так называемые неготовые значения и разделяемые поля объекта. При вызове параллельного метода порождается новый параллельный процесс А. При этом порождающему процессу Б как результат этого вызова возвращается неготовое значение, и работа процесса Б продолжается. При попытке в процессе Б обратиться к неготовому значению процесс блокируется до того момента, как значение станет готовым. По завершении работы процесса А неготовое значение заменяется вычисленным. Параллельные методы также могут работать с разделяемыми полями объекта. Для обеспечения корректности вычисления программы для разделяемых полей используется алгоритм синхронизации, ориентированный на историю доступа к разделяемым полям. Распределение нагрузки: используется автоматический динамический подход распараллеливания программы. Распараллеливание программ происходит автоматически, то есть программисту не требуется явно указывать, на каких узлах должны исполняться параллельные процессы порождаемые программой. Динамическое распараллеливание означает, что узлы, на которых будут выполняться те или иные вызовы, не определены заранее и выбираются непосредственно в процессе исполнения программы, в зависимости от текущей загрузки. Данный подход сочетает в себе универсальность и масштабируемость распараллеливания программ.
Синтаксис T#: T# является расширением C#. Конструкции, связанные с расширением, реализуются за счет использования .NET-атрибутов. В приведенном примере слева показано описание класса с использованием обычного синтаксиса C#, справа этот же класс описан с использованием конструкций расширения:
Т-метод описывается с помощью указания атрибута [parallel], при этом существует ограничение: все Т-методы должны быть виртуальными, а возвращаемое значение должно иметь ссылочный тип данных. Возвращаемое значение является неготовым Т-значением. Разделяемые поля описываются с помощью указания атрибута [shared], при этом если Т-метод работает с разделяемыми полями, то нужно перечислить поля и режим доступа в атрибуте [dependancy], а именно, флаг r означает, что поле используется только для чтения, флаг w позволяет использовать поле и для чтения, и для записи. Создание объекта, содержащего Т-методы, должно осуществляться с помощью вызова метода CreateInstance служебного объекта TProxyFactory: A a=(A)TProxyFactory.CreateInstance(typeof(A), new object[]{}); где первый аргумент метода – тип cоздаваемого объекта, а второй – аргументы конструктора. Архитектура и реализация T# состоит из нескольких уровней: - пользовательский уровень представляет собой T# программы; - прокси-уровень скрывает от пользователя уровень суперструктуры; - Т-суперструктура содержит описание основных Т-структур и реализует Т-семантику (алгоритм параллельной редукции графа вычисления программы, логику работы с готовыми и неготовыми значениями); - Т-runtime (среда исполнения) содержит низкоуровневые детали реализации, такие как транспортный уровень, планировщик задач. Пользовательский уровень содержит три атрибута: [parallel] – для описания Т-методов; [shared] – для описания разделяемых полей; [memoizable] – помечает методы, к которым можно применять мемоизацию, а также интерфейс доступа к прокси-уровню с единственным методом, обеспечивающем создание экземпляров объектов, содержащих Т-методы:TProxyObject.Create Instance(System.Type instanceType, object[]constructorArguments)Прокси-уровень обеспечивает прозрачный доступ из пользовательского уровня к уровню
|
Permanent link: http://swsys.ru/index.php?id=50&lang=en&page=article |
Print version Full issue in PDF (2.00Mb) |
The article was published in issue no. № 4, 2007 |
Back to the list of articles