Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 [ 159 ] 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

Листинг А. 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):



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 [ 159 ] 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.