Главная страница Взаимодействие нетривиальных процессов Листинг А. 10 (продолжение) 74 } 75 void 76 readerCint doorfd, int nbytes) 77 { 78 char c; 79 ssize t n; 80 ntoread = nbytes; /* глобальные переменные процедуры сервера */ 81 nread = 0; 82 Write(contpipe[l], Snbytes, sizeof(nbytes)); 83 if ( (n = Read(contpipe[l], &c, D) != 1) 84 err quit( reader; pipe read returned d , n); 85 } Программа определения полосы пропускания Sun RPC Поскольку вызовы процедур в Sun RPC являются синхронными, для них действует то же ограничение, что и для дверей (см, выше), В данном случае проще создать две программы (клиент и сервер), поскольку они создаются автоматически программой rpcgen, В листинге А,И приведен файл спецификации RPC, Мы объявляем единственную процедуру, принимающую скрытые данные переменной длины в качестве входного аргумента и ничего не возвращающую, В листинге А,12 приведен текст программы-клиента, а в листинге А,13 - процедура сервера. Мы указываем протокол в качестве аргумента командной строки при вызове клиента, что позволяет нам измерить скорость работы обоих протоколов. Листинг А.11. Спецификация RPC для измерения полосы пропускания RPC bench/bw sunrpc.x 1 define DEBUG /* сервер выполняется в приоритетном режиме */ 2 struct data in { 3 opaque data<>: /* скрытые данные переменной длины */ 4 }; 5 program BW SUNRPC PROG { 6 version BW SUNRPC VERS { 7 void BW SUNRPC(dataJn) = 1; 8 } = 1; 9 } = 0x31230001; Листинг A. 12. Клиент RPC для измерения полосы пропускания bench/bw sunrpc client,c 1 #include unpipch 2 #include bw sunrpc.h 3 void *buf; 4 int totalnbytes. xfersize: 5 int 6 mainCint argc. char **argv) 8 int i. nloop. ntowrite: 9 CLIENT *cl: 10 datajn in; 11 if (argc != 6) 12 err quit( usage; bw sunrpc cllent <hostname> <#loops> 13 <#mbytes> <#bytes/write> <protocol> ); 14 nloop = atoi(argv[2]); 15 totalnbytes = atoi(argv[3]) * 1024 * 1024; 16 xfersize = atoi(argv[4]); 17 buf = Valloc(xfersize): 18 Touch(buf. xfersize); 19 cl = Clnt create(argv[l], BW SUNRPC PROG. BW SUNRPC VERS. argv[5]): 20 Start time(); 21 for (i = 0; i < nloop; i++) { 22 ntowrite = totalnbytes: 23 while (ntowrite > 0) { 24 in.data.datajen = xfersize; 25 in.data.data val = buf: 26 if (bw sunrpc l(&in. cl) = NULL) 27 err qu1t( Xs . clnt sperror(cl, argv[l])): 28 ntowrite -= xfersize; 29 } 30 } 31 printf( bandwidth: .3f MB/sec\n , 32 totalnbytes / Stop time() * nloop): 33 exit(O); 34 } Листинг A. 13. Процедура сервера для измерения полосы пропускания RPC bench/bw sunrpc server.c 1 #include unpipc.h 2 #include bw sunrpc.h 3 #ifndef RPCGEN ANSIC 4 #define bw sunrpc l svc bw sunrpc l 5 #endif 6 void * 7 bw sunrpc l svc(datajn *inp. struct svc req *rqstp) 9 static int nbytes; 10 nbytes = inp->data.datajen: 11 return(&nbytes); /* должен быть ненулевым, но xdr void игнорирует */ 12 } А.4. Измерение задержки передачи сообщений: программы Приведем текст трех программ, измеряющих задержку при передаче сообщений по каналам, очередям Posix и очередям Systeffl V. Данные о производительности, полученные с их помощью, приведены в табл, А,1, Программа измерения задержки канала Программа для измерения задержки канала приведена в листинге А,14. Листинг А. 14. Программа измерения задержки канала bench/lat pipe.c 1 #1nclude unpipc.h 2 void 3 doit(int readfd, int writefd) 5 char c; 6 WriteCwritefd, &c, 1): 7 if (ReadCreadfd, &c, 1) != 1) 8 err quit( read error ); 10 int 11 maindnt argc, char **argv) 12 { 13 int i, nloop, pipel[2], pipe2[2]; 14 char c; 15 pid t childpid: 16 if (argc ]= 2) 17 err quit( usage: lat pipe <#loops> ): 18 nloop = atoi(argv[l]); 19 Pipe(pipel): 20 Pipe(pipe2): 21 if ( (childpid = ForkO) == 0) { 22 for ( : ; ) { /* дочерний процесс */ 23 if (Read(pipel[0]. &c, 1) != 1) 24 err quit( read error ): 25 Write(pipe2[l], &c. 1): 26 } 27 exitW): 28 } 29 /* родительский процесс */ 30 doit(pipe2[0], pipel[l]): 31 Start time(); 32 for (i = 0: i < nloop; i++) 33 do1t(pipe2[0], pipel[l]): 34 printf( latency: %.3f usec\n , Stop time() / nloop):
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |