Применение утилиты make

Опубликовано в Технологии > Серверные технологии Продолжение

Следует учесть, что сопровождение всех файлов, связанных с распределенной программой, может стать довольно трудоемким. Вспомогательная программа make позволяет упростить эту работу, поскольку обеспечивает автоматическое выполнение задачи определения того, какие файлы должны быть перетранслированы после внесения изменений. Утилита make считывает файл спецификации, в котором описаны зависимости между файлами программы, и выдает необходимые команды для автоматической перестройки сложных программ. Хотя изложение подробных сведений об утилите make выходит за рамки этой книги, ниже приведен наглядный пример, позволяющий убедиться в том, что даже простой файл спецификации позволяет обеспечить передачу утилите make информации обо всех файлах и командах, необходимых для построения первоначальной или распределенной версий программы работы со словарем. Такие спецификации содержатся в файле Makefile.

После подготовки файла Makefile перетрансляция клиентской и серверной программ выполняется полностью автоматически. Например, после запуска утилиты make на выполнение в каталоге, содержащем файл спецификации rpcgen, файл Makefile и все файлы исходного кода, описанные в настоящей главе, утилита make выполняет приведенную ниже последовательность команд:

rdict_xdr.o:
${CC} ${CFLAGS} -c $*.c
сс diet diet.с сс -с dictl.c сс -с dict2.c rpcgen rdict.х сс -с rdict_clnt.c сс -с rdict_cif.с сс -с rdict.с сс -с rdictjcdr.c
сс -о rdict rdict_clnt.o rdict_cif.o rdict.о rdictjcdr.o chmod 755 rdict cc -c rdict_svc.c cc -c rdict_sif.c cc -c rdict_srp.c
cc -o rdictd rdict_svc.o rdict_sif.o rdict_srp.o rdictjcdr.o chmod 755 rdictd
 

Таким образом, в результате вызова утилиты make на выполнение создается выполняемая клиентская программа rdict и выполняемая серверная программа rdictd.

Резюме

Построение распределенной программы с применением инструментального средства rpcgen происходит в восемь этапов. Вначале создается нераспределенная прикладная программа для решения поставленной задачи, а затем принимается решение о том, как разделить эту программу на компоненты, выполняемые локально и удаленно; программа делится на две физические части, создается файл спецификации с описанием удаленной программы и вызывается на выполнение программа rpcgen для получения необходимых файлов. Затем программист подготавливает клиентские и серверные интерфейсные процедуры и объединяет их с кодом, выработанным программой rpcgen. И наконец, выполняется трансляция и компоновка клиентских файлов и серверных файлов для получения выполняемых программ — клиента и сервера.

Хотя применение программы rpcgen позволяет исключить значительный объем работы по программированию, необходимый при использовании технологии RPC, все вопросы построения распределенной программы должны быть тщательно продуманы. Принимая решение о том, как разделить программу на локальный и удаленный компоненты, необходимо изучить, к каким данным обращается каждая часть программы, чтобы свести к минимуму перемещение данных. Следует также учесть, какую задержку будет вносить каждый дистанционный вызов процедур, и проанализировать, к каким средствам ввода/вывода должен иметь доступ каждый компонент программы. Пример приложения для работы со словарем, представленный в этой главе, показывает, какие значительные усилия требуются для преобразования в распределенную программу даже простейшего приложения. Для более сложных приложений нужны гораздо более сложные спецификации и интерфейсные процедуры. В частности, в значительной степени увеличивается объем кода при разработке таких приложений, которые передают структурированные данные в удаленные процедуры или проверяют права доступа клиента.

Материал для дальнейшего изучения

С дополнительной информацией об инструментальном средстве rpcgen можно ознакомиться в документации, которая поставляется вместе с этим программным обеспечением. Подробные сведения об утилите make представлены в оперативной документации системы Linux.

  1. Доработайте пример программы, представленной в данной главе, таким образом, чтобы процедура клиентского интерфейса записывала в кэш слова, поиск которых проводился в последнее время, и выполняла поиск в кэше перед выполнением дистанционного вызова процедур. Какие дополнительные вычислительные издержки возникают в связи с ведением кэша? Сколько времени позволяет сэкономить кэш, если в нем будет обнаружена необходимая запись?
  2. Разработайте распределенное приложение, которое предоставляет доступ к файлам на удаленном компьютере. Включите в него удаленные процедуры, которые позволяют клиенту выполнять чтение или запись данных в указанной позиции указанного файла.
  3. Разработайте распределенную программу, которая передает удаленной процедуре связанный список в качестве параметра. Подсказка: используйте относительные указатели вместо абсолютных адресов памяти.
  4. Попытайтесь доработать представленную в качестве примера программу для работы со словарем таким образом, чтобы удаленные процедуры могли записывать сообщения об ошибках в стандартный файл сообщений об ошибках на клиентском компьютере. С какими проблемами вы столкнулись? Как вы их решили?
  5. Инструментальное средство rpcgen могло быть спроектировано таким образом, чтобы оно автоматически назначало каждой удаленной процедуре уникальный номер: 1, 2 и т.д. Каковы преимущества и недостатки предоставления программисту возможности назначать номера удаленных процедур вручную в файле спецификации вместо использования автоматического назначения?
  6. Какие ограничения имеет программа rpcgen? Подсказка: рассмотрите возможность построить сервер, который одновременно является клиентом другой службы.
  7. Тщательно изучите код в файле rdict_clnt.c. Какие действия выполняются этой клиентской программой с начала выполнения?
  8. Попытайтесь построить и отладить одновременно две версии распределенной программы для работы со словарем. Возможна ли отладка новых версий, если в серверной части используется общепринятый номер порта? Объясните ваш ответ.
  9. В этом примере программы работы со словарем пробелы распознаются на входе как отдельные символы. Доработайте процедуру nextin таким образом, чтобы она позволяла вводить не только пробелы, но и символы табуляции.
  10. Существует ли возможность преобразовать серверную часть программы работы со словарем в параллельную версию? Объясните ваш ответ.