А. Робачевский - Операционная система UNIX (1114671), страница 84
Текст из файла (страница 84)
Иначе дело об!стоит при вызове удаленной процедуры. Невозможно установить, когдаконкретно будет выполняться процедура, будет ли она выполнена вообще,а если будет, то какое число раз? Например, если запрос будет полученудаленной системой после аварийного завершения программы сервера,процедура не будет выполнена вообще. Если клиент при неполучении от!клика после определенного промежутка времени (тайм!аута) повторно по!сылает запрос, то может создаться ситуация, когда отклик уже передаетсяпо сети,повторный запрос вновь принимается на обработку удаленнойпроцедурой.
В этом случае процедура будет выполнена несколько раз.Таким образом, выполнение удаленной процедуры можно характеризоватьследующей семантикой:Один и толькораз. Данного поведения (в некоторых случаях наибо!лее желательного) трудно требовать ввиду возможных аварий сервера.Максимум раз. Это означает, что процедура либоне была вы!полнена, либо была выполнена только один раз. Подобноеможно сделать при получении ошибки вместо нормального отклика.Хотя бы раз.
Процедура наверняка была выполнена один раз, но воз!и больше. Дляработы в такой ситуацииwww.books-shop.comПрограммные445процедура должна обладать свойствомЭтимобладаетмногократное вы!которой не вызывает кумулятивных изменений. Например,чтение файлаа добавление текста в файл — нет.Представление данныхКогда клиент и сервер выполняются в одной системе на одном компьюте!ре, проблем с несовместимостью данных не возникает. И для клиента идля сервера данные в двоичном виде представляются одинаково.
В случаеудаленного вызова дело осложняется тем, что клиент и сервер могут вы!полняться на системах с различной архитектурой, имеющих различноепредставление данных (например, представление значения с плавающейточкой, порядок следования байтов и т. д.)Большинство реализаций системы RPC определяют некоторые стандарт!ные виды представления данных, к которым должны быть преобразованывсе значения, передаваемые в запросах и откликах.Например, формат представления данных в RPC фирмы Sun Microsystemsследующий:Порядок следования байтовПредставление значений с плавающей точкойПредставление символаСтарший — последнийIEEEASCIIСетьПо своей функциональности система RPC занимает промежуточное местомежду уровнем приложения и транспортным уровнем.
В соответствии смодельюэтому положению соответствуют уровни представления и се!анса. Таким образом, RPC теоретически независим от реализации сети, вчастности, от сетевых протоколов транспортного уровня.Программные реализации системы, как правило, поддерживают один илидва протокола.системаразработки фирмы SunMicrosystems поддерживает передачу сообщений с использованием прото!колов TCP иВыбор того или иного протокола зависит от требова!ний приложения. Выбор протокола UDP оправдан дляобла!дающих следующими характеристиками:Вызываемые процедурыОРазмер передаваемых аргументов и возвращаемого результата мень!ше размера пакета— 8 Кбайт.Сервер обеспечивает работу с несколькими сотнями клиентов. По!скольку при работе с протоколами TCP сервер вынужден поддержи!вать соединение с каждым из а к т и в н ы х клиентов, это занимаетwww.books-shop.com446Глава 6.часть его ресурсов.
Протоколляется менее ресурсоемкимсети всистемев этом отношении яв!С другой стороны, TCP обеспечивает эффективную работу приложений соследующими характеристиками:Приложению требуется надежный протокол передачиВызываемые процедурыРазмер аргументов или возвращаемого результата превышает 8 КбайтВыбор протокола обычно остается за клиентом, и система по!разному ор!ганизует формирование и передачу сообщений. Так, при использованиипротокола TCP, для которого передаваемые данные представляют собойпоток байтов, необходимо отделить сообщения друг от друга. Для этого,например, применяется протоколзаписей, описанный вRemote Procedure Call Protocolversion 2", прикотором в начале каждого сообщения помещается 32!разрядное целое чис!ло, определяющее размер сообщения в байтах.По!разному обстоит дело и с семантикой вызова.
Например, есливыполняется с использованием ненадежного транспортного протоколасистема выполняет повторную передачу сообщения через короткиепромежутки времени (тайм!ауты). Если приложение!клиент не получаетотклик, то с уверенностью можно сказать, что процедура была выполненаноль или большее число раз. Если отклик былприложение мо!жет сделать вывод, что процедура была выполнена хотя бы однажды. Прииспользовании надежного транспортного протокола (TCP) в случае полу!ч е н и я отклика можно сказать, что процедура была выполнена один раз.Если же отклик не получен, определенно сказать, что процедура выполне!на не была,Как это работает?Пособственно система RPC является встроенной в программу!клиент и программу!сервер.
Отрадно, что при разработке распределенныхприложений, не придется вникать в подробности протокола RPC илипрограммировать обработку сообщений. Система предполагает существо!вание соответствующей среды разработки, которая значительно облегчаетжизнь создателям прикладного программного обеспечения. Одним изключевых моментов в RPC является то, что разработка распределенногоприложения начинается с определения интерфейса— формаль!ного описания функций сервера, сделанного на специальном языке. Наосновании этого интерфейса затем автоматически создаются заглушкиДаже при использовании надежных транспортных протоколов в случае аварийногошения работытребуютсясвязии повторнаяВ этом случаетакже меняется.www.books-shop.comПрограммные447клиента и сервера.
Единственное, что необходимо сделать после этого, —написать фактический код процедуры.В качестве примера рассмотрим RPC фирмы Sun Microsystems.Система состоит из трех основных частей:rpcgen(l) —который на основании описания ин!терфейса удаленной процедуры генерирует заглушки клиента и сер!вера в виде программ на языке С.Библиотека XDRData Representation), которая содержитфункции для преобразования различных типов данных в машинно!независимый вид, позволяющий производить обмен информациеймежду разнородными системами.Библиотека модулей, обеспечивающих работу системы в целом.Рассмотрим пример простейшего распределенного приложения для веде!ния журнала событий. Клиент при запуске вызывает удаленную процедурузаписи сообщения в файл журнала удаленного компьютера.Для этого придется создать как минимум три файла: спецификацию ин!терфейсов удаленных процедур(на языке описания интерфейса),собственно текст удаленных процедури текст головной программыклиента main—(на языке С) .Компиляторна основании спецификации log.x создает три фай!ла: текст заглушек клиента и сервера на языке Сиифайл описанийиспользуемый обеими заглушками.Итак, рассмотрим исходные тексты программ.log.xВ этом файле указываются регистрационные параметры удаленной про!цедуры — номера программы, версии и процедуры, а также определяетсяинтерфейс вызова — входные аргументы и возвращаемые значения.
Такимобразом, определена процедура RLOG, в качестве аргумента принимаю!щая строку (которая будет записана в журнал), азначениестандартно указывает на успешное или неудачное выполнение заказаннойоперации.program LOG_PROG {version LOG_VER (RLOG (string)1;} = i;} =Компилятор rpcgen(l) создает файл заголовков log.h, где, в частности, оп!ределены процедуры:www.books-shop.com448Глава 6.сети в операционной системе UNIX/** Please do not edit this file.* It was generated using rpcgen.ttifndef<rpc/rpc.h>ftdefineftdefineRLOGextern intlong)/*Внутренняя процедура — нам ее использовать неextern int/**/Рассмотрим этот файл внимательно. Компилятор транслирует имя RLOG,определенное в файле описания интерфейса, взаменяя пропис!ные символы на строчные и добавляя номер версии программы с подчер!киванием. Тип возвращаемого значения изменился сна intТаковоправило — RPC позволяет передавать и получать только адреса объявлен!ных при описании интерфейса параметров.
Это же правило касается и пе!редаваемой в качестве аргумента строки. Хотя из файлаэто не сле!дует, на самом деле в качестве аргумента функциитакже пере!дается адрес строки.Помимо файла заголовков компиляторклиента и заглушки сервера. Повесь код удаленного вызова.создает модули заглушкив тексте этих файлов заключенЗаглушка сервера является головной программой,всесетевое взаимодействие с клиентом (точнее, с его заглушкой). Для выпол!нения операции заглушка сервера производит локальный вызов ф у н к ц и и ,текст которой необходимо написать:log. с<rpc/rpc.h>#include<sys/stat.h>значение должно определяться какstatic int result;intдескрипторintwww.books-shop.comПрограммные интерфейсы449result =файл журналаесли он неслучае неудачи вернем код ошибки result ==!,j! 0 APPEND); < 0! returnв=if!= len!result =elseresult0;результат — адрес}Заглушка клиента принимает аргумент, передаваемый удаленнойре, делает необходимые преобразования, формирует запрос на серверобменивается данными с сервером удаленной процедуры и,наконец, передает возвращаемое значение клиенту.
Для клиента вызовудаленной процедуры сводится к вызову заглушки и ничем не отличаетсяот обычного локального вызова.client.cargc, char{CLIENTchar*server,time tserver =В случае неудачи — сообщим оневозможности установления связи сif (rȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com450Глава 6. Поддержка сети в операционной системе UNIX/*Выделим буфер для строки*/mystring = (char *)malloc(100);/*0пределим время события*/bintime = time((time_t *)NULL);clnttime = ctime(&bintime );sprintf (mystring, "%s — Клиент запущен",clntime);/*Передадим сообщение для журнала — время начала работы клиента.В случае неудачи — сообщим об ошибке*/if ( ( r e s u l t = rlog_l(&mystring, cl)) == NULL) {fprintf(stderr, "error2\n");clnt_perror(cl, server);exit (3) ;}/*B случае неудачи на удаленном компьютере сообщим об ошибке*/if (*result !=0 )fprintf(stderr, "Ошибка записи в журнал\п"!;/"Освободим дескриптор*/clnt_destroy(cl);exit(0);Заглушка клиентакомпилируется с модулемисполняемой программы клиента.для получе!оЗаглушка сервераиния исполняемой программы сервера.окомпилируются для получе!log svc.eТеперь на некотором хосте server.nowhere.ru необходимо запустить сервер!ный$ loggerПосле чего при запуске клиента Hog на другой машине сервер добавит со!ответствующую запись в файл журнала.Схема работы RPC в этом случае приведена на рис.