
774 Глава 12. Распределенные системы согласования
События также могут использоваться и
в
JavaSpace. Так, в частности, клиент
может попросить уведомлять его о том, что в JavaSpace записан определенный
экземпляр кортежа. Для этого клиент вызывает операцию notify, реализованную
во всех пространствах JavaSpace. Эта операция получает в качестве исходных
данных эталонный кортеж, который сличается с экземплярами кортежей, храня-
щимися в JavaSpace, точно так же, как это происходит в ходе операций read или
take.
Использование событий
в
JavaSpace иллюстрирует рис.
12.13.
Отметим, что
пока клиент получает уведомление о сохранении экземпляра кортежа и присту-
пает к его чтению, другой процесс может уже прочитать этот экземпляр кортежа
и удалить его из JavaSpace. Подобные условия гонок
—
не редкость для генера-
тивной связи и избежать их обычно нелегко.
12.3.3.
Процессы
в процессах системы Jini нет ровно ничего особенного. Однако реализация серве-
ра JavaSpace часто требует особого внимания. Давайте кратко рассмотрим неко-
торые вопросы, связанные с реализацией сервера
JavaSpace.
Мы сконцентрируем
свое внимание на распределенных реализациях серверов JavaSpace, то есть таких
реализациях, в которых набор экземпляров кортежей может быть разбросан по
нескольким машинам. Последний обзор методов реализации исполняющих сис-
тем с кортежами имеется в
[388].
Эффективная распределенная реализация JavaSpace должна решать две про-
блемы:
4 Как эмулировать ассоциативную адресацию без глобального поиска.
4 Как распределить экземпляры кортежей по машинам и как их потом обна-
ружить.
Ключ к решению обеих проблем состоит в том, чтобы считать каждый кортеж
структурой данных определенного типа. Разделив пространство кортежей на под-
пространства, в каждом из которых находятся кортежи одного типа, мы упрощаем
программирование и делаем возможной некоторую оптимизацию. Так, напри-
мер,
поскольку кортежи типизированы, то уже на этапе компиляции можно оп-
ределить, в каком подпространстве производится данная операция write, read
или take. Такое дробление означает, что поиск экземпляра кортежа будет произ-
водиться не во всем наборе кортежей, а только в его части.
Кроме того, каждое из этих подпространств можно организовать в виде хэш-
таблицы, использующей i-e поле или его часть в качестве ключа хэш-таблицы.
Напомним, что каждое поле экземпляра кортежа ~ это подвергнутая маршалин-
гу ссылка на объект. Jini не определяет способ маршалинга, поэтому маршалинг
ссылок в конкретной реализации может выполняться так, чтобы первые не-
сколько байтов ссылки после маршалинга определяли тип объекта, на который
она указывает. Таким образом, вызов операций write, read или take может осуще-
ствляться путем вычисления значения хэш-функции i-ro поля, в результате чего
мы получим положение экземпляра кортежа в таблице. Зная подпространство
и положение экземпляра кортежа в таблице, можно ничего не искать. Разумеется,