Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Автореферат'
Защита состоится «_23_» __декабря__ 2006 г. в _12_ часов на заседании диссертационного совета Д.212.063.04 в ГОУ ВПО «Ивановский государственный хими...полностью>>
'Документ'
Разработка проекта и технологий реализации стратегий маркетинга. Разработка проекта и технологий реализации стратегий интеграции. Разработка проекта ...полностью>>
'Литература'
Обществознание § 11 практикум письменно 8. География § 37, 38, 39 9. ОИВТ Модели на сайте школы 10. Биология Рабочая тетрадь § 8, 9, 30. Учебник § 30...полностью>>
'Книга'
В книге изложены темы, касающиеся различных областей семей­ной психологии, — выбор партнера и вступление в брак, динамика се­мейных отношений, воспит...полностью>>

Главная > Реферат

Сохрани ссылку в одной из сетей:

Министерство по делам науки, высшей школы и технической политики

Институт Точной Механики и Оптики (Технический Университет)

______________________________________________________

Реферат

“Организация параллельных вычислений

на базе программного обеспечения PVM”

Автор:

аспирант кафедры ВВ и КМ

Евсеев И.Г.

Научный руководитель:

зав.кафедрой ВВ и КМ, д. ф.-м. наук, проф.

Богданов А.В.

Санкт - Петербург

1997

Общие замечания.

Инструментарий PVM по замыслу разработчиков должен стать для прикладных программистов некоторых направлений таким же подспорьем, каким стали ОС Unix и язык программирования Си для программистов вообще. Имеются в виду направления, связанные с громоздкими математическими вычислениями; именно они (опережая делопроизводство и коммуникации) обусловили бурное развитие ЭВМ, а позднее - развитие ЭВМ с параллельной архитектурой. В подобных вычислительных комплексах над решением одной задачи трудится не один процессор, а набор (“коллектив”) процессоров, причем каждый способен оперировать (в наиболее мощных машинах) не только числами, но также векторами и матрицами.

Можно привести несложные примеры ускорения вычислений на таких ЭВМ. Например, заполнение массива из n ячеек нулями потребует не n*? операций, а всего лишь несколько (обнулить векторный регистр, скопировать n ячеек векторного регистра в ОЗУ). Нахождение максимума коллективом процессоров можно ускорить, поручив каждому из процессоров поиск локального максимума на соответствующей части массива с последующим выбором наибольшего из них. Задача переформулировки классического “не-параллельного” алгоритма в термины параллельных вычислений является очень творческой, и требует от проблемного программиста определенных навыков.

По мере наращивания парка ЭВМ с параллельной архитектурой перед прикладными программистами встала та же проблема, что и перед программистами-системщиками по мере роста количества обычных ЭВМ - проблема переносимости программ. Программы зачастую пишутся на языках Си и Фортран, которые являются мобильными, и компиляторы которых зачастую содержат в себе оптимизирующий модуль (“проход”), сопоставляющий мобильным конструкциям входного текста очень эффективные для конкретной платформы куски кода (например, на векторной ЭВМ компилятор автоматически заменит поячеечное обнуление векторным). Программы пользуются стандартными библиотечными функциями, которые уже реализованы для конкретной платформы в предельно быстром виде. Однако существующие стандарты языков и операционных систем общего назначения пока не охватывают сферу параллельных вычислений.

Инструментарий для параллельных вычислений очевидным образом можно разбить на две категории:

  • системный - синхронизация, связь, управление и контроль над параллельно выполняющимися (взаимосвязанными) процессами, независимо от решаемых ими задач,

  • прикладной - специализированные библиотеки и программы для проведения математических расчетов, соптимизированные для каждой платформы.

PVM относится к первой категории, и с успехом может применяться (и применяется) для создания второй.

Структура и назначение PVM.

Проект PVM ведет свою историю с 1989 года. Замышлялся он как исследовательский, а не как коммерческий. Это программное средство для объединения гетерогенного (то есть неоднородного) набора вычислительных средств в единое целое. Для использующего PVM программиста такой набор средств представляется как единая виртуальная параллельная машина (аббревиатура PVM и расшифровывается как Parallel Virtual Machine). Программист ничего не должен знать ни об архитектуре физических ЭВМ (количество процессоров, быстродействие, разрядность данных, состав периферийных устройств), ни об их соединении (тип и пропускная способность каналов связи, топология сети и т.д.). От столь разного “железа” базовый вариант PVM требовал лишь, чтобы оно:

  • работало под управлением Юникса,

  • было связано между собой сетью с протоколом TCP/IP.

Наметившийся вскоре интерес к проекту коммерческих организаций - производителей компьютеров был вызван тем, что PVM лучше своих предшественников позволял:

  • переносить на новый компьютер бóльшую номенклатуру программ с меньшими затратами, тем самым стимулируя у потребителя интерес к новой технике,

  • старые компьютеры, не способные по отдельности справляться с современными вычислительными задачами за приемлемый срок, объединять в виртуальный компьютер с требуемой производительностью,

  • использовать считавшиеся раньше непригодными для серьезных вычислений, но широко применяемые в делопроизводстве персональные ЭВМ, а точнее, их сети в офисах и бюро, в ночное время неофициально или за минимальную арендную плату. Сеть из нескольких сотен “персоналок” по суммарной вычислительной мощности вполне может соперничать с суперкомпьютером.

В данный момент поддержкой разработки ядра PVM и переносом его на свои компьютеры заняты более 30 фирм - ведущих производителей вычислительной техники, в частности, IBM, Cray, DEC, HP, Sun, SGI и т.д.

Структурно PVM состоит из двух обязательных частей:

  • библиотек программирования с заголовочными файлами (изначально поддерживались Фортран и Си), которыми проблемный программист пользуется для написания приложения,

  • программы-демона, называемой PVMD (“демон” - термин из жаргона Юникса; это программа, предназначенная для выполнения автоматических, без диалога с пользователем, сервисных действий, например, обслуживания запросов от других задач. Для тех, кто знает DOS - это полный аналог резидентной программы).

Обе части написаны на Си, и должны быть скомпилированы (построены) на каждой физической ЭВМ, предназначенной для работы в составе PVM. Замечание: здесь будет так же рассмотрен один важный необязательный компонент PVM: консольный интерпретатор команд.

Гипотетическая машина, создаваемая посредством PVM, не является многопользовательской. Если несколько пользователей запускают свои приложения PVM на одной и той же аппаратной базе, такие приложения не имеют никаких “точек соприкосновения” - идентификаторы задач (по смыслу аналогичны имеющимся в Юниксе), символьные имена групп (этот термин раскрывается ниже) в двух PVM, запущенных для двух пользователей, могут в общем случае и совпадать. Для каждого пользователя создается своя виртуальная машина, обособленная от остальных. На практике это означает, что на физической ЭВМ, на которой выполняются PVM-приложения пятерых пользователей, будет запущено пять копий программы PVMD - по одной для каждого. При этом на диске данной ЭВМ файлы PVM хранятся, конечно же, в единственном экземпляре.

В данный момент возможность и необходимость межпользовательской “стыковки” PVM-приложений обсуждается, и, возможно, в ближайших версиях PVM соответствующие средства появятся.

Методика проектирования.

Если отрешиться от технических деталей, которыми, кстати, PVM не перегружен, то можно выделить несколько простых и понятных аспектов, о которых следует помнить проблемному программисту:

  • алгоритм предварительно приводится к параллельному виду и записывается в виде нескольких ветвей,

  • ветви могут между собой обмениваться данными в виде сообщений,

  • ветви могут пересекаться и в пересекающихся частях синхронизировать друг с другом свое выполнение (то есть с гарантией одновременно приступать к выполнению следующих за точкой синхронизации команд),

  • все ветви алгоритма сводятся в единую программу (приложение),

  • в ОЗУ программа загружается и выполняется в количестве экземпляров, равном количеству ветвей в алгоритме. Эти экземпляры называются задачами (как и в Юниксе),

  • задачи объединяются в группу. Каждая группа в PVM объединяет все задачи, работающие над одним алгоритмом, и только их. Возможностей для взаимодействия соседям по группе PVM предоставляет намного больше, чем просто двум задачам,

  • каждая задача в зависимости от своего порядкового номера в группе приступает к выполнению той или иной ветви.

Последовательность запуска PVM и приложений.

Выделим здесь следующие этапы:

1)

Установка и настройка программного обеспечения PVM на всех физических машинах, предназначенных для участия в имитации виртуальной ЭВМ. Выполняется один раз системным администратором.

2)

Создание пользователем PVM собственного файла описания сети физических машин на каждой из них - выполняется один раз, и только если физических машин больше, чем одна.

3)

Написание и компиляция (с участием библиотеки PVM) приложения на любой физической машине.

4)

После того, как ошибки компиляции устранены, перенос исходных текстов на другие машины и компиляция их там. Эта стадия легко автоматизируется.

5)

Запуск PVMD на любой из машин с консоли. Автоматически будут запущены демоны на всех остальных машинах.

6)

Запуск первого экземпляра приложения с консоли на той из машин, где оно имеется в скомпилированном виде. Первый экземпляр запустит все последующие.

7)

После завершения работы приложения - выгрузка PVMD вручную или через интерпретатор команд PVM.

Состав библиотек.

В соответствии с документацией все библиотечные функции разбиты на 7 категорий:

  • управление задачами (запуск/завершение и т.д.),

  • информационные,

  • управление аппаратным составом PVM (подключить/отключить компьютер от PVM),

  • сигнальные (включают оповещение указанной задачи о происходящих внутри PVM событиях),

  • настроечные,

  • передача сообщений,

  • организация групп и внутригрупповое взаимодействие.

Категория “передача сообщений” по числу функций является наиболее представительной, хотя смысл реализованной идеи очень прост: если одна задача хочет отправить другой какие-то данные, задача-передатчик заказывает у PVM передающий буфер, и помещает в него требуемые данные. Затем следует вызов функции передачи. Задача-приемник должна вызвать функцию приема и извлечь из заполненного приемного буфера эти данные. PVM гарантирует доставку сообщений в том же порядке, в каком они отправлялись. Кроме того, если задача-приемник и задача-передатчик находятся на разных машинах, имеющих разное представление данных (например, разный порядок байтов в целых числах), PVM позаботится о корректном приведении данных в машинно-зависимый формат получателя. Сам PVM хранит данные в формате XDR, принятом в Internet.

Чтобы поставить PVM в известность о формате передаваемых данных, и позволить ему правильно их преобразовывать, закладка данных осуществляется поэлементно: чтобы передать структуру (составной тип данных, используемый в Си), нужно вызвать функцию закладки в буфер для каждого поля структуры. Каждому стандартному типу Си (и Фортрана) соответствует своя функция закладки и извлечения из буфера. Поэлементная закладка и извлечение - довольно медленная процедура, особенно если обе задачи - приемник и получатель - находятся на одной и той же машине, и данные никак преобразовывать на самом деле не надо. Это одно из нынешних наиболее узких мест PVM, хотя некоторые возможности для оптимизации здесь имеются.

Вся передача сообщений первоначально велась через гнезда (sockets), предоставляемые протоколом TCP/IP, однако впоследствии эта часть PVM была разбита на три ветви: сообщения между разными ЭВМ передаются через гнезда; если задачи выполняются на одном и том же процессоре или на машине с разделяемой памятью, то “каналом” передачи служит разделяемая память; на машине с архитектурой MPI используется скоростная внутримашинная сеть (наличие этой части делает PVM архитектурно-зависимой). Тем самым скорость работы PVM на многопроцессорных машинах была значительно увеличена, что положительно сказалось на практической применимости пакета.

По логике вещей, перед нормальным пользователем PVM редко встают вопросы типа “а как такая-то задача узнает, что некая другая задача передала ей сообщение?”, поскольку предполагается заранее упорядоченный алгоритмом, а не хаотический обмен сообщениями. Следует помнить, что поскольку задачи взаимодействуют друг с другом для вычислений в рамках одного алгоритма, (обрабатывая разные его ветви), составляя ветви, программист должен в исходном тексте прямо указать: для одной ветви - передачу данных, а для другой - прием. Возможен прием с ожиданием (в т.ч. с заданием тайм аута) и без него, но согласованность разных задач в проведении сеансов связи обязательна.

Сообщениям присваиваются числовые идентификаторы, которые наряду с идентификатором задачи-отправителя помогают получателю правильно интерпретировать принимаемые в составе сообщения данные.

Другая категория функций, связанная с организацией и поддержкой групп, предоставляет задачам две важных возможности:

  • получить номер внутри группы; в отличие от идентификатора внутри PVM с непредсказуемым значением, групповой номер всегда лежит в диапазоне от 0 до [размер группы - 1] - тем самым осуществляется привязка конкретной задачи к той или иной ветке алгоритма,

  • синхронизировать свое выполнение с соседями по группе.

Поддержку групп не удалось реализовать компактно, и в итоге она была вынесена в отдельный библиотечный файл (остальные функции находятся во втором библиотечном файле и внутри PVMD).

Интерпретатор команд.

Стандартный интерпретатор команд и вспомогательные утилиты Юникса предоставляют пользователю доступ к возможностям реальной ЭВМ. Интерпретатор команд PVM служит тем же целям. Пользователь “заходит” на виртуальную ЭВМ, просто запуская интерпретатор (который так и называется: pvm). На ней он запускает задачи, следит за ходом их выполнения (для этого в pvm встроены команды, идентичные командам Юникса, такие как ps, pstat, kill и т.д.), при необходимости подключает и отключает от PVM физические машины, а выход из pvm означает завершение работы с виртуальной ЭВМ. Интерпретатор незаметно для пользователя выполняет всю рутинную работу, в частности, при запуске он на всех физических машинах загружает копии программы PVMD, а перед выходом выгружает их.

pvm не заменяет существующие “одномашинные” интерпретаторы, а дополняет их. Он способен запустить задачу с любой машины, но чтобы скопировать на эту машину исходные тексты, потребуется утилита Юникса rcp, а чтобы их скомпилировать - сетевой интерпретатор rsh. Таким образом, работа в pvm должна циклически чередоваться с работой в обычной командной строке: из нее пользователь запускает редактор для правки исходных текстов, компилирует их на каждой физической ЭВМ (эта стадия легко автоматизируется посредством создания сценариев), а в pvm - управляет собственно выполнением приложений PVM и PVM в-целом. В pvm как таковой отсутствует командный язык с условными операторами, переменными и т.д.

Зачем нужен демон PVMD ?

Введение демона в состав PVM, хотя и сделало пакет внешне более громоздким, на самом деле является совершенно оправданным. В случае его отсутствия код содержащихся в нем функций пришлось бы перенести в приложения (поместив его в библиотеки PVM, подключаемые к приложению на стадии компоновки), что чревато следующими недостатками.

1)

Приложения становятся более громоздкими и занимают на диске и в памяти больше места.

2)

Если приложение, запущенное раньше остальных и взявшее на себя функции менеджера PVM, завершается, оно должно корректно передать выполнение “общественных” обязанностей одной из остающихся задач. Написание такой процедуры требует дополнительного времени и сил.

3)

Если приложение-менеджер завершится по ошибке времени выполнения (run-time error), не связанной с “оргнагрузкой”, это может привести к краху всех оставшихся приложений.

4)

Если в управляющем коде обнаружена и исправлена ошибка или добавлена новая возможность, вместо перекомпиляции демона, выполняемой один раз администратором системы, потребуется перекомпиляция ВСЕМИ пользователями ВСЕХ своих приложений PVM, поскольку каждое из них может стать менеджером. Иными словами, исправления и улучшения в код проще вносить, если весь этот код собран в одном месте.

5)

Многие действия внутри PVM гораздо проще отслеживать, если они проходят через обязательную общую точку - демона.

На PVMD (что расшифровывается как “PVM daemon”) возложены следующие задачи:

  • контроль за целостностью PVM (надежная связь с остальными PVMD),

  • маршрутизация сообщений, которыми обмениваются между собой приложения PVM,

  • запуск приложений PVM на той физической машине, на которой PVMD работает, и контроль за их выполнением,

  • предоставление задачам, выполняющимся в среде PVM, информации о задачах, физических машинах и PVM в целом; кроме того, предоставление им возможности заменять те или иные функции PVM своими собственными (в частности, таким образом в PVM предусмотрена возможность использовать внешний отладчик, который вызывается вместо стандартной процедуры для запуска новой задачи).

Недостатки PVM.

Общей ахиллесовой пятой всякого программного инструментария вообще (а не только инструментария для разработки и выполнения мобильных программ с параллельной архитектурой) являются следующие проблемы:

1)

Сложность его освоения пользователями (в нашем случае - проблемными программистами).

2)

Сложная и/или ограниченная переносимость собственно инструментария (речь о переносимости создаваемых на нем программ здесь еще не идет).

3)

Ограничения, накладываемые по сравнению с уже существующими средствами, возможность использования старых наработок в составе новых средств или хотя бы параллельно с ними.

4)

Падение производительности (говоря шире - большая ресурсоемкость), тем более сильное, чем больше новый инструментарий претендует на универсальность.

5)

Качество конкретной программной реализации.

Значимость этих проблем для рассматриваемого проекта условно можно обозначить как пропорцио-нальную номеру пункта:

1)

PVM имеет простой, легко запоминающийся интерфейс, прекрасно документирован, широко и оперативно освещается в Интернете.

2)

Сложности при переносе инструментария не бóльшие, чем в аналогичных случаях (по опыту переноса пакетов miniSQL и GNU Assembler)

3)

PVM является библиотекой Си/Фортрана, и не содержит неявных и/или непривычных ограничений.

4)

Задача, написанная с использованием PVM, теряет в скорости по сравнению со своим машинно зависимым аналогом, однако: а) в PVM вводятся все новые возможности сократить этот разрыв, и, б) при удачно распараллеленном алгоритме на межзадачное взаимодействие уходит не настолько много времени, чтобы проигрыш в нем ощутимо сказался на ОБЩЕМ времени выполнения программы.

5)

Реализации PVM содержат серьезные ошибки, в частности, такие, которые очень трудно выловить, но впоследствии так же легко обойти. Первоначальная локализация такой ошибки может стать крайне затруднительным и растянутым на неизвестный срок делом.

Помимо вышеуказанных, PVM содержит несколько “тактических” недостатков, в частности:

  • в PVM недостаточно развиты контроль и управление за производительностью и загруженностью используемых компьютеров, за топологией, пропускной способностью и загруженностью сети. Конечно, хорошо, что программист не должен обо всем этом помнить в принудительном порядке, но плохо, что он, даже если и захочет это сделать, не имеет возможности повлиять на эту часть деятельности PVM,

  • слабо освещена, и, судя по документации, недостаточно устойчиво реализована работа с сигналами, столь хорошо известная системным программистам-юниксоидам как эффективное средство межзадачного взаимодействия внутри Юникса. Как следствие отказа от механизма сигналов, возможна потеря быстродействия на ряде алгоритмов, как следствие их использования - ненадежная работа приложений PVM,

... и так далее.

От версии к версии, однако, значительная часть предложений разработчиками спецификации учитывается.

MPI - смежный проект.

В 1994 году коммерческое крыло группы по разработке PVM, неудовлетворенное низким быстродействием PVM и отсутствием в PVM опционального пользовательского контроля за аппаратными ресурсами, привлекаемыми в виртуальную машину, приняло решение начать разрабатывать инструментарий, лишенный этих недостатков. Если девизом PVM можно считать Гетерогенность, то девизом нового проекта было выбрано Быстродействие, за счет отказа от работы в гетерогенной сети, но с сохранением переносимости. Программный инструментарий, названный MPI (message passing interface), в настоящее время создан и входит в комплект поставки (свободной или платной) всех параллельных компьютеров: как с одноименной аппаратной архитектурой MPI, так и с архитектурой SMP (shared memory processors). Он эффективно (теоретически) работает на одной машине или на комплексе машин с фиксированным составом и топологией сети. Тем не менее, планируется его слияние с PVM по следующим причинам:

  • PVM более распространен, поскольку он старше,

  • в PVM переносятся многие удачные находки из MPI. Быстродействие PVM повышается от версии к версии, добавляются новые низкоуровневые функции для точной настройки “железа”,

  • зафиксированное в стандарте MPI отсутствие механизма демонов-диспетчеров делает его работу менее надежной, а реализацию - более громоздкой,

  • PVM лучше подходит для связывания нескольких компьютеров,

  • продолжение разработки MPI приведет к тому, что одна и та же группа фирм под двумя разными вывесками будет финансировать создание двух программных продуктов-близнецов, создавая лишнюю головную боль покупателю.

Аргументы против немедленного слияния следующие:

  • каждая фирма вкладывает в обе разработки мизерные средства, и экономия от закрытия какого-либо проекта смехотворна,

  • в проектах сложились неодинаковые “табели о рангах” как для участвующих организаций, так и для конкретных исполнителей,

  • быстродействие MPI может оказаться важнее для потребителя, чем гибкость PVM,

  • MPI стремительно впитывает в себя возможности PVM (как, например, свободное увеличение числа задач по требованию приложения), и по мере развития предлагает новые, отсутствующие в PVM возможности. Это поощряет конкуренцию внутри коллектива и делает развитие обоих проектов более динамичным,

  • из-за ошибок в реализации PVM может проиграть конкуренцию более качественно написанному сопернику.

PVM шаг за шагом.

Хронологически освоение PVM автором этого документа происходило следующим образом:

1)

Прочтение книги “PVM: Parallel Virtual Machine. A User's Guide and Tutorial for Networked Parallel Computing” - главного документа, предоставляющего очень толковую и подробную информацию по PVM вообще, без учета реализации. Цель: написание методического пособия.

2)

Составление, отладка и прогон примеров по PVM под Windows-95 и под HP-UX на компьютере Convex SPP-1600. Цель: написание практического раздела пособия. Результат: знакомство с недокументированными “прелестями” PVM, главная из которых - наличие в конкретных реализациях мелких (по объему неверного кода) ошибок, которые: а) проявляются c высокой вероятностью; б) с невероятным трудом локализуются; в) проявившись, делают невозможной работу PVM в-целом. Завершение этого этапа естественным образом совпадает с публикацией пособия в Интернете (по адресу /~il/pvm_tutor).

3)

Проведение семинара по PVM в Отделе системной интеграции Института высокопроизводительных вычислений и баз данных.

4)

Написание данного отчета.

5)

В будущем - возможные консультации научных сотрудников, использующих предоставляемое Институтом ВВиБД машинное время для проведения прикладных расчетов.

Первоначально подразумевалось, что каждый следующий шаг будет являться подмножеством предыдущего, на практике же оказалось, что они слабо пересекаются если не по предмету изложения, то по расставляемым в изложении акцентам, поскольку адресованы трем разным категориям специалистов: методическое пособие - математикам и физикам, программирующим вычислительные методы на ЭВМ; на семинаре присутствовали системные администраторы и программисты, обязанные по долгу службы заниматься обслуживанием PVM и поддержкой пользователей внутри ИВВиБД; и, наконец, данный отчет имеет своей целью дать представление о PVM каждому желающему. Огромную роль на каждом шаге, безусловно, играл опыт, накопленный при прохождении предыдущих; и наоборот: сведения, полученные на новом шаге заставляли возвращаться к уже, казалось бы, пройденным.



Скачать документ

Похожие документы:

  1. Государственный комитет российской федерации по высшему образованию санкт-петербургский государственный институт точной механики и оптики (технический университет)

    Реферат
    Нейрокомпьютеры - это системы, в которых алгоритм решения задачи представлен логической сетью элементов частного вида - нейронов с полным отказом от булевских элементов типа И, ИЛИ, НЕ.
  2. А. Л. Чижевский Чижевский Александр Леонидович

    Документ
    Мыслители-космисты в своем творчестве  выдвинули идею активной эволюции , которая предполагает необходимость нового сознательного этапа развития мира, когда человечество направляет его в сторону, которую ему диктует не только разум,
  3. Петербургский Государственный Университет Информационных Технологий, Механики и Оптики Кафедра вычислительной техники реферат

    Реферат
    Во все времена, а тем более в настоящее время, информация являлась одной из наиболее важных и нужных ценностей человечества. Достаточно вспомнить пословицу: «Кто владеет информацией, тот владеет миром».
  4. Государственное образовательное учреждение высшего профессионального образования московский государственный технический университет гражданской авиации (2)

    Документ
    Разработка теоретико-методологического обоснования создания на базе МГТУГА системы дистанционного обучения лиц с ограниченными возможностями для получения ими дополнительного образования,
  5. Рекомендуется Минобразованием России для специальности 190700 Оптико-электронные приборы и системы направления подготовки диплом (2)

    Диплом
    Цель и задачи курса состоят в том, чтобы студенты приобрели знания и навыки, необходимые для проектирования оптических приборов и систем с учетом номенклатуры и свойств оптических материалов, типов и методов изготовления оптических

Другие похожие документы..