next up previous contents
Next: Зарезервированные значения ключей Up: Установка соединения Previous: Процедуры клиента   Contents

Опубликование имен

Процедуры в этом разделе предоставляют механизм опубликования имен. Пара (service_name, port_name) публикуется сервером и может восстанавливаться клиентом при использовании только service_name. Реализация MPI определяет границы service_name, то есть область, в которой service_name может быть восстановлено. Если область представляет собой пустое множество (т.е., ни один клиент не может восстановить информацию), мы говорим, что опубликование имен не поддерживается. Реализации должны описывать, как определяются эти границы. Высококачественные реализации могут дать пользователю определенный контроль над функциями опубликования имен через аргумент info. Примеры приведены в описании отдельных функций.





MPI_PUBLISH_NAME (service_name, info, port_name)



IN service_name Имя сервиса для ассоциации с портом (строка)  
IN info Информация, зависящая от реализации (дескриптор)  
IN port_name Имя порта (строка)  





int MPI_Publish_name(char *service_name, MPI_Info info, char*port_name)

MPI_PUBLISH_NAME (SERVICE_NAME, INFO, PORT_NAME, IERROR)
INTEGER INFO, IERROR
CHARACTER*(*) SERVICE_NAME, PORT_NAME

void MPI::Publish_name(const char* service_name,
const MPI::Info& info, const char* port_name)

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

Реализация должна определять границы опубликованного имени сервиса, то есть область, в которой имя сервиса уникально и, с другой стороны, область, в которой может быть восстановлена пара (port_name, service_name). В частности, имя сервиса может быть уникально для задачи (когда задача определяется распределенной операционной системой или пакетным планировщиком), уникально для машины или уникально в области Kerberos. Граница может зависеть от аргумента info для MPI_PUBLISH_NAME.

MPI запрещает опубликование более чем одного service_name для одного port_name. С другой стороны, если service_name уже опубликовано внутри границ, определенных info, поведение
MPI_PUBLISH_NAME не известно. Реализация MPI может через механизм аргумента info для
MPI_PUBLISH_NAME предоставить способ, разрешающий существование нескольких серверов с одним и тем же сервисом в одних и тех же границах. В этом случае, политика, определяемая реализацией, будет определять, какое из нескольких имен портов будет возвращаться MPI_LOOKUP_NAME.

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

Аргумент port_name должен быть именем порта, установленного MPI_OPEN_PORT и еще не закрытого MPI_CLOSE_PORT. Если это не так, результат будет неопределенным.

Совет разработчикам: В некоторых случаях реализация MPI может использовать имя сервиса, к которому пользователь также может получить прямой доступ. В этом случае имя, опубликованное MPI, может легко вступить в конфликт с именем, опубликованным пользователем. Чтобы избежать таких конфликтов, реализации MPI должны искажать имена сервисов, чтобы они не были похожи на пользовательский код, использующий тот же самый сервис. Такое искажение имен, конечно, должно выполняться прозрачно для пользователя.[]

Следующая ситуация проблематична, но неизбежна, если мы хотим позволить реализациям использовать серверы имен. Предположим, что несколько экземпляров ``ocean'' запущены на одной машине. Если граница действия имени сервиса ограничивается задачей, несколько ``ocean'' могут сосуществовать. Если реализация предоставляет границу действия в пределах машины, тогда несколько экземпляров невозможны, поскольку все вызовы MPI_PUBLISH_NAME после первого завершатся с ошибкой. Для этой проблемы нет универсального решения. Чтобы справиться с этой ситуацией, высококачественная реализация должна сделать возможным ограничение области, для которой публикуются имена.





MPI_UNPUBLISH_NAME (service_name, info, port_name)



IN service_name Имя сервиса (строка)  
IN info Информация, зависящая от реализации (дескриптор)  
IN port_name Имя порта (строка)  





int MPI_Unpublish_name(char *service_name, MPI_Info info, char*port_name)

MPI_UNPUBLISH_NAME (SERVICE_NAME, INFO, PORT_NAME, IERROR)
INTEGER INFO, IERROR
CHARACTER*(*) SERVICE_NAME, PORT_NAME

void MPI::Unpublish_name(const char* service_name,
const MPI::Info& info, const char* port_name)

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

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

Если аргумент info был использован вместе с MPI_PUBLISH_NAME, чтобы сообщить реализации, как опубликовывать имена, реализация может потребовать, чтобы info, передаваемый функции MPI_UNPUBLISH_NAME, содержал информацию о том, как отменить опубликование имен.





MPI_LOOKUP_NAME (service_name, info, port_name)



IN service_name Имя сервиса (строка)  
IN info Информация, зависящая от реализации (дескриптор)  
OUT port_name Имя порта (строка)  






int MPI_Lookup_name (char *service_name, MPI_Info info, char*port_name)

MPI_LOOKUP_NAME(SERVICE_NAME, INFO, PORT_NAME, IERROR)
CHARACTER*(*) SERVICE_NAME, PORT_NAME
INTEGER INFO, IERROR

void MPI::Lookup_name(const char* service_name,
const MPI::Info& info, char* port_name)

Эта функция восстанавливает port_name, опубликованное через MPI_PUBLISH_NAME, по
service_name. Если service_name еще не было опубликовано, она вызывает ошибку класса
MPI_ERR_NAME. Приложение должно иметь для port_name буфер достаточной величины, чтобы хранить максимально возможное имя порта (см. предыдущее обсуждение MPI_OPEN_PORT).

Если реализация позволяет несколько вхождений одного и того же service_name с теми же границами действия, определенное port_name выбирается способом, определяемым реализацией.

Если аргумент info был использован вместе с MPI_PUBLISH_NAME, чтобы сообщить реализации, как опубликовывать имена, такой же аргумент info может потребоваться MPI_LOOKUP_NAME.


next up previous contents
Next: Зарезервированные значения ключей Up: Установка соединения Previous: Процедуры клиента   Contents
Alex Otwagin 2002-12-10