Распределенное программирование на языке MC#
Цель - изучить структуру Runtime-системы языка MC# для поддержки распределенных вычислений, процедуры загрузки и остановки Runtime-системы и особенностей распределенного программирования на примере программы All2all.
Под распределенным программированием на языке MC# понимается разработка программ, которые будут исполняться на кластере или (Grid-) сети машин.
Ключевым средством языка MC# для порождения параллельных процессов, которые могут исполняться распределено (т.е., на удаленных машинах), являются movable-методы. Movable-методы - это методы классов языка MC#, которые помечены ключевым словом movable и при вызове которых, система исполнения программ на языке MC# (Runtime-система) планирует и переносит этот метод для исполнения на удаленную машину (обычно, выбираемую исходя из принципа наименьшей ее загруженности среди всех доступных машин).
Прежде чем распределенные программы могут быть запущены, необходимо загрузить Runtime-систему языка MC# командой
mcsboot <имя конфигурационного файла>
где в конфигурационном файле перечисляются имена машин/узлов (по одному имени на строку), на которых предполагается исполнять распределенные программы.
Остановка Runtime-системы производится командой
mcshalt
Одной из ключевых особенностей языка MC# является то, что, в общем случае, во время вызова movable-метода, все необходимые данные, а именно
- сам объект, которому принадлежит данный movable-метод, и
- его аргументы (как ссылочные, так и скалярные значения)
только копируются (но не перемещаются) на удаленную машину. Следствием этого является то, что все изменения, которые осуществляет movable-метод с внутренними полями объекта, проводятся с полями объекта-копии на удаленной машине, и не переносятся на исходные объекты.
Задача 1. Оттранслировать и выполнить программу
и объяснить ее результаты, выдаваемые на печать, а именно, значения переменной x до и после вызова movable-метода Compute.
Другая ключевая особенность языка MC# состоит в том, что в распределенном режиме, при копировании каналов и обработчиков на удаленную машину автономно (т.е., в качестве аргументов movable-методов) или в составе некоторого объекта, они становятся прокси-объектами, или посредниками для оригинальных каналов и обработчиков. Как обычно, все действия с прокси-объектами перенаправляются Runtime-системой на исходные каналы и обработчики.
Задача 2. Оттранслировать и выполнить в распределенном режиме программу All2all, представленную ниже.
В этой программе демонстрируется взаимодействие множества распределенных процессов между собой по принципу "каждый с каждым". Перед началом такого взаимодействия, каждый распределенный процесс из этого множества создает собственный объект класса BDChannel, который служит для взаимодействия с другими процессами множества. Взаимообмен такими объектами происходит через главную программу. Имея объекты BDChannel других процессов, процесс может воспользоваться каналом Send и обработчиком Receive этих объектов (точнее, их прокси-объектов) для посылки сообщений другим процессам и приема сообщений от них.