Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

28 ntowrite –= xfersize;

29 }

30 }

31 printf("bandwidth: %.3f MB/sec\n",

32 totalnbytes / Stop_time * nloop);

33 exit(0);

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_1_svc bw_sunrpc_1

5 #endif

6 void *

7 bw_sunrpc_1_svc(data_in *inp, struct svc_req *rqstp)

8 {

9 static int nbytes;

10 nbytes = inp->data.data_len;

11 return(&nbytes); /* должен быть ненулевым, но xdr_void игнорирует */

12 }

А.4. Измерение задержки передачи сообщений: программы

Приведем текст трех программ, измеряющих задержку при передаче сообщений по каналам, очередям Posix и очередям System V. Данные о производительности, полученные с их помощью, приведены в табл. А.1.

Программа измерения задержки канала

Программа для измерения задержки канала приведена в листинге А.14.

Листинг А.14. Программа измерения задержки канала

//bench/lat_pipe.c

1 #include "unpipc.h"

2 void

3 doit(int readfd, int writefd)

4 {

5 char c;

6 Write(writefd, &c, 1);

7 if (Read(readfd, &c, 1) != 1)

8 err_quit("read error");

9 }

10 int

11 main(int argc, char **argv)

12 {

13 int i, nloop, pipe1[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[1]);

19 Pipe(pipe1);

20 Pipe(pipe2);

21 if ((childpid = Fork) == 0) {

22 for(;;) { /* дочерний процесс */

23 if (Read(pipe1[0], &c, 1) != 1)

24 err_quit("read error");

25 Write(pipe2[1], &c, 1);

26 }

27 ехit(0);

28 }

29 /* родительский процесс */

30 doit(pipe2[0], pipe1[1]);

31 Start_time;

32 for (i = 0; i < nloop; i++)

33 doit(pipe2[0], pipe1[1]);

34 printf("latency: %.3f usec\n", Stop_time / nloop);

35 Kill(childpid, SIGTERM);

36 exit(0);

37 }

Функция doit

2-9 Эта функция запускается родительским процессом. Мы измеряем время ее работы. Она помещает 1 байт в канал, из которого читает дочерний процесс, и считывает 1 байт из другого канала, в который сообщение помещается дочерним процессом. При этом измеряется именно то, что мы назвали задержкой, — время передачи небольшого сообщения туда и обратно.

Создание каналов

19-20 Создаются два канала, после чего вызов fork порождает дочерний процесс. При этом образуется схема, изображенная на рис. 4.6 (но без закрытия неиспользуемых дескрипторов каналов). Для этого теста требуются два канала, поскольку каналы являются односторонними, а мы хотим передавать сообщение в обе стороны.

Дочерний процесс отсылает обратно сообщение

22-27 Дочерний процесс представляет собой бесконечный цикл, в котором однобайтовое сообщение считывается и отсылается обратно.

Измерение времени работы родительского процесса

29-34 Родительский процесс вызывает функцию doit для отправки однобайтового сообщения дочернему процессу и получения ответа. После этого мы имеем гарантию, что оба процесса выполняются. Затем функция doit вызывается в цикле с измерением времени задержки.

На компьютере Sparc под управлением Solaris 2.6 при запуске программы пять раз подряд мы получим вот что:

solaris % lat_pipe 10000

  • Читать дальше
  • 1
  • ...
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: