Чтение онлайн

на главную - закладки

Жанры

UNIX: взаимодействие процессов

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

Шрифт:

79 ssize_t n;

80 ntoread = nbytes; /* глобальные переменные процедуры сервера */

81 nread = 0;

82 Write(contpipe[1], &nbytes, sizeof(nbytes));

83 if ((n = Read(contpipe[1], &c, 1)) != 1)

84 err_quit("reader: pipe read returned %d", n);

85 }

Программа определения полосы пропускания Sun RPC

Поскольку вызовы процедур в Sun RPC являются синхронными, для них действует то же ограничение, что и для дверей (см. выше). В данном случае проще создать две программы (клиент и сервер), поскольку они создаются автоматически программой rpcgen. В листинге А.11 приведен файл спецификации RPC. Мы объявляем единственную процедуру, принимающую скрытые данные переменной длины в качестве входного аргумента и ничего не возвращающую.

В листинге А.12 приведен текст программы-клиента, а в листинге А.13 — процедура сервера. Мы указываем протокол в качестве аргумента командной строки при вызове клиента, что позволяет нам измерить скорость работы обоих протоколов.

Листинг А.11. Спецификация RPC для измерения полосы пропускания RPC

//bench/bw_sunrpc.х

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(data_in) = 1;

8 } = 1;

9 } = 0x31230001;

Листинг A.12. Клиент RPC для измерения полосы пропускания

//bench/bw_sunrpc_client.с

1 #include "unpipc.h"

2 #include "bw_sunrpc.h"

3 void *buf;

4 int totalnbytes, xfersize;

5 int

6 main(int argc, char **argv)

7 {

8 int i, nloop, ntowrite;

9 CLIENT *cl;

10 data_in in;

11 if (argc != 6)

12 err_quit("usage: bw_sunrpc_client <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[1], 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.data_len = xfersize;

25 in.data.data_val = buf;

26 if (bw_sunrpc_1(&in, cl) == NULL)

27 err_quit("%s", clnt_sperror(cl, argv[1]));

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);

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

Кодекс Охотника. Книга XXXVIII

Винокуров Юрий
38. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVIII

Т. 03 Гражданин Галактики

Хайнлайн Роберт Энсон
3. Отцы-основатели. Весь Хайнлайн
Фантастика:
научная фантастика
7.00
рейтинг книги
Т. 03 Гражданин Галактики

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Кадет Морозов

Шелег Дмитрий Витальевич
4. Живой лёд
Фантастика:
боевая фантастика
5.72
рейтинг книги
Кадет Морозов

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Мл. сержант. Назад в СССР. Книга 3

Гаусс Максим
3. Второй шанс
Фантастика:
альтернативная история
6.40
рейтинг книги
Мл. сержант. Назад в СССР. Книга 3

Неведомые дороги (сборник)

Кунц Дин Рей
Фантастика:
ужасы и мистика
8.00
рейтинг книги
Неведомые дороги (сборник)

Статьи

Переслегин Сергей Борисович
Документальная литература:
публицистика
5.00
рейтинг книги
Статьи