+7 (812) 670-9095
Обратная связьEnglish
Главная → О компании → Пресс-рум → Пресса о нас
Версия для печати

Разработка прикладного API системы распределенной общей памяти МАКС DSM

«Системный администратор», 17 июля 2017

Павел Бойко

В журнале «Системный администратор» опубликована статья Павла Бойко, заместителя директора по направлению системного ПО в АстроСофт. Павел рассказал о разработке прикладного API системы распределенной общей памяти МАКС DSM.





Традиционно коммуникации в распределенных системах без общей памяти реализуются через примитивы обмена сообщениями Send и Receive. Наиболее популярным стандартом в этой области стал MPI. Однако программные решения, основанные на передаче сообщений в распределённых системах, оказались чрезвычайно сложны.

Альтернативный подход предложила концепция распределённой общей памяти (англ. Distributed Shared Memory, DSM) [5]. Оказалось, что даже при физическом отсутствии общей памяти, возможно создать программную прослойку, успешно такую память имитирующую. DSM предоставляет возможность существенно упростить организацию коммуникаций в распределённых системах за счет перехода на более высокий уровень абстракции, не требуя от разработчика «ручного» управления отдельными сообщениями, курсирующими в системе, а предлагая лишь производить обычные операции с памятью, консистентность которой на всех узлах системы обеспечивается внутренними механизмами.

Концепция DSM применима к любым видам распределенных систем. Однако сфера устройств Интернета вещей (англ. Internet of Things, IoT), одна из наиболее бурно развивающихся, стимулирующая массовый интерес к распределенным системам, остаётся данной концепцией не охваченной. Одна из причин, по всей видимости, заключается в том, что прежние DSM - системы, [1–4] и др., разрабатывались зачастую на экзотических языках программирования (требуя создания новых или адаптации существующих компиляторов) и/или под неиспользуемые сегодня ОС.

В данной ситуации была разработана система МАКС DSM, интегрируемая в ОСРВ МАКС – систему, предназначенную для упрощения разработки ПО в сфере Embedded и IoT. В статье рассмотрен подход к созданию интерфейса прикладного программирования (API) к МАКС DSM.


Разработка прикладного API системы распределенной общей памяти МАКС DSMПредпосылки

Одна из наиболее существенных характеристик DSM - системы – удобство её использования. С целью избежать недостатков, присущих прежним решениям, при разработке прикладного интерфейса системы МАКС DSM были учтены следующие требования:

  • Реализация на стандартном языке С++.
  • Классическая концепция DSM интерфейса – маркировка распределённых переменных и специальные секции для работы с ними.
  • Жесткая связь каждой распределённой переменной с конкретной секцией.
  • Доступ к распределённым переменным только внутри соответствующих секций.
  • Синтаксическая лаконичность и самоочевидность результирующего прикладного кода.
  • Контроль выполнения заданных правил на этапе компиляции.

Реализация

Обеспечить выполнение данных принципов позволило задействование языка С++ и директив препроцессора (что не типично для создававшихся DSM-систем). Последние позволили использовать техники метапрограммирования, расширив язык, не изменяя компилятор. Шаблоны принципиально не использовались, так как результирующие конструкции оказались бы слишком сложны для многих программистов, а уровень поддержки стандарта языка в области шаблонов со стороны среды разработки может различаться от продукта к продукту, что особенно характерно для компиляторов в области embedded. Простейшая программа с МАКС DSM:


Листинг 1. Пример простейшей программы с МАКС DSM

1 MDSM_DECLARE(X) // Объявляем группу распределенных переменных с именем «X».
2   int i ; // В данном примере группа содержит всего одну переменную. 
3 MDSM_DECLARE_END // 
4 
5 int main () 
6 { 
7   int result = 2; 
8 
9   MDSM_ACCESS_RW( X ) // Демонстрируется доступ на запись 
10   MDSM_ITEM( i ) = result + 1; // к переменным группы «X». 
11  MDSM_ACCESS_END // 
12 
13  MDSM_ACCESS_RO( X ) // Демонстрируется доступ на чтение. 
14    result = MDSM_ITEM( i ) – 3; // 
15  MDSM_ACCESS_END // 
16 
17  return result; 
18 } 

Объявление распределённых переменных отличается от объявления локальных лишь обрамлением из директив MDSM_DECLARE и MDSM_DECLARE_END. Так как внутри DSM необходимо иметь возможность работы со всеми переменными одной группы как с непрерывной областью памяти (сериализация и др.), обрамляющие директивы генерируют вокруг переменных пользователя структуру (struct). Структура, в свою очередь, помещается в класс (class), предоставляющий операции управления группой. Генерация дубликатов кода предотвращается наследованием данного класса от некоторого базового, реализующего общие методы. Возможность универсальной работы с любым из подобных классов в механизмах, описываемых ниже, обеспечивается их единым именованием. Возможность же создания множества групп переменных в одной программе обеспечивается размещением каждого класса в индивидуально сгенерированном пространстве имен (namespace), содержащем в названии уникальный идентификатор, задаваемый в качестве параметра конструкции MDSM_DECLARE.

Конструкции MDSM_ACCESS_RW и MDSM_ACCESS_RO, с точки зрения пользователя, открывают критическую секцию для работы с соответствующей группой распределённых переменных. С точки зрения реализации, данные конструкции создают переменную-ссылку на экземпляр класса, содержащий интересующие пользователя переменные (параллельно сгенерировав уникальное имя соответствующего пространства имён). В зависимости от типа конструкции (*_RW используется для доступа на чтение и запись, *_RO – только для чтения), ссылка создается либо обычная, либо константная (const). Таким образом предотвращаются возможные ошибки пользователя, при которых секция открывается на чтение, но в ней производится модификация распределённой переменной. Для унификации последующих операций в любой секции ссылка создается всегда с одним и тем же именем. Дублирование имен ссылок предотвращается генерацией индивидуальной области видимости для каждой критической секции. Сразу после создания ссылки на класс, генерируется код для вызова метода этого класса, обеспечивающего консистентность переменных соответствующей группы.

Конструкция MDSM_ACCESS_END завершает критическую секцию. Несмотря на то, что конструкция синтаксически не зависит от типа закрываемой секции (чтение-запись или только чтение), функционально поведение генерируемого кода различается: в случае доступа на чтение, дополнительных вызовов механизмов DSM не производится. В случае же доступа на чтение-запись, вызывается механизм распространения изменений по узлам системы. Синтаксической идентичности при различном поведении удаётся достичь использованием признака константности ссылки на класс, содержащий распределённые переменные. В обоих случаях генерируется вызов специального метода данного класса, параметром которому является эта же ссылка. Внутри класса имеется функция, перегруженная по признаку наличия/отсутствия спецификатора const у параметра. Соответственно, константная версия функции содержит пустую реализацию, вторая же – вызов механизма распространения данных.

Конструкция MDSM_ITEM генерирует лишь обращение к указанной пользователем распределённой переменной, используя известное системе константное имя ссылки на класс, данную переменную содержащий.

Благодаря описанным выше механизмам, в МАКС DSM удалось совместить простой синтаксис, проверку на соблюдение пользователем соглашений системы на этапе компиляции и отсутствие зависимости от каких-либо дополнительных компонентов среды разработки.


Список литературы:
  1. Bal H. E., Kaashoek M. F., Tanenbaum A. S. Orca: a language for parallel programming of distributed systems // IEEE Transactions on Software Engineering. – 1992. – Mar. – Vol. 18, no. 3. – P. 190-205.
  2. Bershad B. N., Zekauskas M. J., Sawdon W. A. The Midway distributed shared memory system // Digest of Papers. Compcon Spring. – 1993. – Feb. – P. 528-537.
  3. Carter J. B. Design of the Munin distributed shared memory system // Journal of Parallel and Distributed Computing. – 1995. – Vol. 29, no. 2. – P. 219-227.
  4. Gelernter D. Generative Communication in Linda // ACM Trans. Program. Lang. Syst. – 1985. – Jan. – Vol. 7, no. 1. – P. 80-112. – URL: http://doi.acm.org/10.1145/2363.2433.
  5. Stumm M., Zhou S. Algorithms implementing distributed shared memory // Computer. – 1990. – May. – Vol. 23, no. 5. – P. 54-64.

Источник Источник
Печатная версия