Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 52
Текст из файла (страница 52)
Несмотря на то что эта простая идея некоторое время находила широкое применение, она никогда не считалась общим решением всех проблем переносимостидля других языков, особенно С.По прошествии приблизительно 20 лет проблему переноса кода в гетерогенных системах начали решать средствами языков сценариев, а также языков, обладающих высокой степенью переносимости, таких как Java.
Все эти решения,в общем, основаны на виртуальной машине, которая интерпретирует либо непосредственно исходные тексты программ (в случае языков сценариев), либо промежуточный код, выдаваемый компилятором (для Java). Предложить свой товарв нужном месте в правильное время оказывается важно и для разработчиковязыков программирования.Единственный серьезный недостаток переносимости, реализуемой при помощи виртуальных машин, состоит в том, что приходится ограничиваться конкретным языком, да еще таким, которого частенько никто не знает.
По этой причиневажно, чтобы языки, предназначенные для переноса, имели интерфейс с существующими языками.3.4.4. Пример — D'AgentЧтобы проиллюстрировать перенос кода, рассмотрим теперь платформу промежуточного уровня, поддерживающую различные формы переноса кода. D'Agent,или полностью Agent TCL, — это система, построенная на основе концепции200Глава 3. Процессыагента. Агентом в системе D'Agent называется программа, которая в гетерогеннойсистеме способна перемещаться с одной машины на другую. Сейчас мы сосредоточимся на возможностях переноса кода в системе D'Agent, а к более общему обсуждению программных агентов вернемся в следующем пункте.
Мы также проигнорируем вопросы безопасности, о них мы поговорим в главе 8. Дополнительнуюинформацию по D'Agent можно найти в [180, 242].Обзор переноса кода в D'AgentАгент в системе D'Agent — это программа, которая может перемещаться с одноймашины на другую. В принципе программы могут быть написаны на разных языках, главное, чтобы машина, на которую переносится код, могла выполнить его.На практике это означает, что программы в D'Agent пишутся на интерпретируемых языках, а конкретнее, на командном языке утилит (Tool Command Language,Tel), Java или Scheme [336, 375].
Использование исключительно интерпретируемых языков значительно облегчает поддержку гетерогенных систем.Программа, или агент, исполняется в процессе, запущенном интерпретаторомязыка, на котором эта программа написана. Мобильность поддерживается тремяспособами — посредством инициированной отправителем слабой мобильности,посредством сильной мобильности с переносом процессов и, наконец, посредством сильной мобильности с клонированием процессов.Слабая мобильность реализуется при помощи команды agent_subm1t. В качестве параметра используется идентификатор машины, на которую переноситсякод.
На этой же машине выполняется сценарий. Сценарий — это не что иное, какпоследовательность инструкций. Сценарий переносится на машину-получательвместе со всеми описаниями процедур и копиями переменных, которые необходимы для его выполнения на этой машине. На машине-получателе процесс запускает подходящий интерпретатор, который и выполняет сценарий. В понятияхвариантов переноса кода (см. рис. 3.9), D'Agent обеспечивает инициированнуюотправителем слабую мобильность, когда перенесенный код выполняется в отдельном процессе.В качестве примера слабой мобильности в D'Agent рассмотрим листинг 3.4.В нем представлена часть простого агента на языке Тс1, которая посылает сценарий на удаленную машину.
В этом агенте процедура factorial получает единственный параметр и рекурсивно вычисляет факториал для значения параметра.Переменные numbers и machine должны быть правильно инициализированы (путем запроса значения у пользователя), после чего агент вызывает команду agent_submit. На целевую машину, определяемую значением переменной machine, вследза определением процедуры factorial и исходным значением переменной numberпересылается следующий сценарий:factorial $numberD'Agent автоматически вычисляет результат и возвращает его отправителю.Вызов agent_receive приводит к блокированию агента, инициировавшего перенос, до момента возвращения ему результата.3.4.
Перенос кода201Листинг 3.4. Простой пример агента D'Agent на языке Тс1, пересылающего сценарий наудаленную машину (адаптация сценария из [179])ргос factorial п {i f {$п <= 1} {return 1;}expr $n * [factorial [ expr $n - 1 ] ]}set number ...set machine ...#fac(l) = 1#fac(n) = n * fac(n-l)# указать, какой факториал вычислять# идентифицировать целевую машинуagent^submit $machine -procs factorial -vars number -script { factorial $number }agent_receive ...# получить результатТакже поддерживается инициируемая отправителем сильная мобильность,как в форме миграции, так и в форме клонирования процессов. Для переноса работающего агента агент вызывает команду agentjump с указанием целевой машины,на которую он должен быть перенесен.
При вызове команды agentjump исполнениеагента на исходной машине приостанавливается и его сегмент ресурсов, сегменткода и сегмент исполнения подвергаются маршалингу, укладываясь в сообщение, которое затем пересылается на целевую машину. После доставки сообщениязапускается новый процесс, в котором исполняется соответствующий интерпретатор. Этот процесс выполняет демаршалинг пришедшего сообщения и продолжает выполнение с инструкции, следующей за последним вызовом agent_jump. Процесс, в котором агент выполнялся на исходной машине, прекращаетсвою работу.Пример переноса агентов, приведенный в листинге 3.5, иллюстрирует упрощенную версию агента, который обнаруживает только что вошедшего в системупользователя, выполняя команду who UNIX-системы на каждом из хостов.
Поведение агента определяется процедурой all_users. Она поддерживает список пользователей, который изначально пуст. Набор хостов, которые будут посещатьсяагентом, определяется параметром mashines. Агент переходит с хоста на хост, помещая результат выполнения команды who в переменную users и добавляя егок списку. В основной программе на текущей машрп1е создается агент для рассылкис использованием рассмотренного ранее механизма слабой мобильности. В данном случае команда agent_submit будет вызвана для выполнения следующего сценария:dll_users SmachinesКоманде передается процедура и набор хостов в качестве дополнительных параметров.Листинг 3.5.
Пример агента D'Agent на языке Тс1, перемещающегося с машинына MaujHHy, исполняя команду who UNIX-системы (адаптация сценария из [73])ргос all_users machines {set l i s t ""foreach m Smachines {agentjump $mset users [exec who]####создать изначально пустой списокдля всех хостов из заданных машинпереместиться на следующий хоствыполнить команду who202Глава 3. Процессыappend list $users}return $11 St# добавить результаты к списку# no окончании вернуть список# инициализировать набор машин# задать хост для старта агентаset machines ...set this machine# Создать агент переноса для переноса сценария на ту машину.# с которой агент начнет просматривать остальные машины.# указанные в $mach1nesagent_subm1t $th1s_mach1ne -procs all^users -vars machines \-script (an_users $mach1nes}agent_receive ...# получить результатИ, наконец, поддерживается клонирование процессов посредством командыagent_fork. Эта команда работает почти так же, как и agentjump, за исключениемтого, что процесс, запустивший агента на исходной машине, просто продолжаетработу с инструкции, следующей за вызовом agent^fork.
Подобно операцрш forkв UNIX-системах, команда agent^fork возвращает значение, по которому вызвавший ее процесс может определить, что перед ним — клонированная версия(в UNIX именуемая «дочерней») или оригинальный процесс («родитель»).Вопросы реализацииЧтобы рассмотреть некоторые детали внутренней реализации, рассмотрим написанные на Тс1 агенты. Изнутри система D'Agent состоит из пяти уровней, как показано на рис. 3.11. Самый нижний уровень сравним с сокетами Беркли, в томсмысле, что он реализует единый интерфейс механизмов взаимодействия базовой сети. В D'Agent предполагается, что базовая сеть предоставляет механизмыдля работы с сообщениями TCP и электронной почты.5Агенты4Интерпретатор Интерпретатор ИнтерпретаторТс1ЯкSchemeJava3Обобщенный агент RTS2Сервер1TCP/IP1E-mailРис.
3 . 1 1 . Архитектура системы D'AgentСледующим уровнем является сервер, работающий на каждой машине, на которой выполняется D'Agent. Сервер отвечает за управление агентами, авторизацию и управление связью между агентами. Для последнего вида деятельностисервер присваршает каждому агенту локальный уникальный идентификатор. Если использовать сетевой адрес сервера, каждый из агентов может быть обозна-3.4. Перенос кода203чен парой (адрес, локальный идентификатор). Подобное имя низкого уровня используется для установки связи между двумя агентами.Третий уровень — сердце системы D'Agent.
Он содержит независимое от языка ядро, которое поддерживает основные модели агентов. Так, например, этотуровень содержит реализацию запуска и окончания работы агента, реализацииразличных операций переноса и средства для связи между агентами.
Понятно,что операции ядра недалеко ушли от операций сервера, но в отличие от сервераядро не отвечает за управление набором агентов, размещенных на одной машине.Четвертый уровень содержит интерпретаторы, по одному на каждый поддерживаемый в D'Agent язык. Каждый интерпретатор содержит компонент интерпретации языка, модуль безопасности, интерфейс с уровнем ядра и отдельныймодуль для перехвата состояния работающего агента. Этот последний модульнеобходим для поддержки сильной мобильности и будет детально рассмотренниже.Самый верхний уровень содержит агенты, написанные на одном из поддерживаемых системой языков. Каждый агент D'Agent выполняется в отдельномпроцессе. Так, например, когда агент переносится на машину Л, сервер разветвляет процесс выполнения соответствующего интерпретатора, создавая ветку длявыполнения этого агента.
Новый процесс подхватывает состояние мигрировавшего агента и продолжает его выполнение с той точки, на которой он был приостановлен. Сервер отслеживает локальные каналы созданного процесса, посредством которых процесс получает предназначенные для него сообщения.Более сложная часть реализации D'Agent — это получение состояния работающего агента и передача его на другую машину. В случае Тс1 состояние агентаописывается частями, показанными в табл. 3.3. По существу, состояние агентаописывается четырьмя таблицами, содержащими глобальные определения переменных и сценариев, и двумя стеками, отслеживающими состояние выполнения.Таблица 3 , 3 .
Части, о п и с ы в а ю щ и е состояние агента в системе D'AgentСостояниеОписаниеГлобальные переменныеинтерпретатораПеременные, необходимые интерпретатору агентовГлобальные системныепеременныеКоды возврата, коды ошибок, строки сообщенийоб ошибках и т. д.Глобальные переменныепрограммыОпределяемые пользователем глобальные переменныепрограммыОпределения процедурОпределения сценариев, выполняемых агентомСтек командСтек выполняемых в настоящее время командСтек вызововСтек записей об активизации, по одной на каждуювыполняемую командуИнтерпретатору необходима таблица, в которой хранятся глобальные переменные. Так, обработчик событий может сообщать интерпретатору, какую процедуру следует вызывать в случае прихода сообщения от некоторого агента. Пары (событие, обработчик) хранятся в таблице интерпретатора.