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

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

Жанры

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

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

Шрифт:

33 arg.desc_num = 0;

34 arg.rbuf = &c;

35 arg.rsize = sizeof(char);

36 if (Read(contpipe[0], &c, 1) != 1) /* ждем создания */

37 err_quit("pipe read error");

38 doorfd = Open(argv[1], O_RDWR);

39 Door_call(doorfd, &arg); /* запуск */

40 Start_time;

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

42 Door_call(doorfd, &arg);

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

44 Kill(childpid, SIGTERM);

45 unlink(argv[1]);

46 exit(0);

47 }

Программа измерения времени задержки Sun RPC

Для измерения времени задержки Sun RPC мы напишем две программы: клиент и сервер, аналогично измерению полосы пропускания. Мы используем старый файл спецификации RPC, но на этот раз клиент вызывает нулевую процедуру сервера. Вспомните упражнение 16.11: эта процедура не принимает никаких аргументов и ничего не возвращает. Это именно то, что нам нужно, чтобы определить задержку. В листинге А.18 приведен текст клиента. Как и в решении упражнения 16.11, нам нужно воспользоваться clnt_call для вызова нулевой процедуры; в заглушке клиента отсутствует необходимая заглушка для этой процедуры.

Листинг А.18. Клиент Sun RPC для измерения задержки

//bench/lat_sunrpc_client.с

1 #include "unpipc.h"

2 #include "lat_sunrpc.h"

3 int

4 main(int argc, char **argv)

5 {

6 int i, nloop;

7 CLIENT *cl;

8 struct timeval tv;

9 if (argc != 4)

10 err_quit("usage: lat_sunrpc_client <hostname> <#loops> <protocol>");

11 nloop = atoi(argv[2]);

12 cl = Clnt_create(argv[1], BW_SUNRPC_PROG, BW_SUNRPC_VERS, argv[3]);

13 tv.tv_sec = 10;

14 tv.tv_usec = 0;

15 Start_time;

16 for (i = 0; i < nloop; i++) {

17 if (clnt_call(cl, NULLPROC, xdr_void, NULL,

18 xdr_void, NULL, tv) != RPC_SUCCESS)

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

20 }

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

22 exit(0);

23 }

Мы компилируем сервер с функцией, приведенной в листинге А.13, но она все равно не вызывается. Поскольку мы используем rpcgen для построения клиента и сервера, нам нужно определить хотя бы одну процедуру сервера, но мы не обязаны ее вызывать. Причина, по которой мы используем rpcgen, заключается в том, что она автоматически создает функцию main сервера с нулевой процедурой, которая нам нужна.

А.5. Синхронизация потоков: программы

Для измерения времени, уходящего на синхронизацию при использовании различных средств, мы создаем некоторое количество потоков (от одного до пяти, согласно табл. А.4 и А.5), каждый из которых увеличивает счетчик в разделяемой памяти большое количество раз, используя различные формы синхронизации для получения доступа к счетчику.

Взаимные исключения Posix

В листинге А.19 приведены глобальные переменные и функция main пpoгрaммы, измеряющей быстродействие взаимных исключений Posix.

Листинг А.19. Глобальные переменные и функция main для взаимных исключений Posix

//bench/incr_pxmutex1.с

1 #include "unpipc.h"

2 #define MAXNTHREADS 100

3 int nloop;

4 struct {

5 pthread_mutex_t mutex;

6 long counter;

7 } shared = {

8 PTHREAD_MUTEX_INITIALIZER

9 };

10 void *incr(void *);

11 int

12 main(int argc, char **argv)

13 {

14 int i, nthreads;

15 pthread_t tid[MAXNTHREADS];

16 if (argc != 3)

17 err_quit("usage: incr_pxmutex1 <#loops> <#threads>");

18 nloop = atoi(argv[1]);

19 nthreads = min(atoi(argv[2]), MAXNTHREADS);

20 /* блокировка взаимного исключения */

21 Pthread_mutex_lock(&shared.mutex);

22 /* создание потоков */

23 Set_concurrency(nthreads);

24 for (i = 0; i < nthreads; i++) {

25 Pthread_create(&tid[i], NULL, incr, NULL);

26 }

27 /* запуск таймера и разблокирование взаимного исключения */

28 Start_time;

29 Pthread_mutex_unlock(&shared.mutex);

30 /* ожидание завершения работы потоков */

31 for (i = 0; i < nthreads; i++) {

32 Pthread_join(tid[i], NULL);

33 }

34 printf("microseconds: %.0f usec\n", Stop_time);

35 if (shared.counter != nloop * nthreads)

36 printf("error: counter = %ld\n", shared, counter);

37 exit(0);

38 }

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

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Девять драконов

Скотт Джастин
Детективы:
триллеры
5.00
рейтинг книги
Девять драконов

Бастард Императора. Том 12

Орлов Андрей Юрьевич
12. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 12

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

Меткий стрелок. Том II

Вязовский Алексей
2. Меткий стрелок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Меткий стрелок. Том II

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Неучтенный элемент. Том 3

NikL
3. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 3

Том 11. Рассказы. Очерки. Публицистика. 1894-1909

Твен Марк
Проза:
классическая проза
5.00
рейтинг книги
Том 11. Рассказы. Очерки. Публицистика. 1894-1909

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Травница Его Драконейшества

Рель Кейлет
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Травница Его Драконейшества

Я спас ссср! том iv

Вязовский Алексей
4. Я спас СССР
Фантастика:
альтернативная история
6.62
рейтинг книги
Я спас ссср! том iv

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7