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

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

Жанры

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

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

Шрифт:

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

latency: 278.633 usec

solaris % lat_pipe 10000

latency: 397.810 usec

solaris % lat_pipe 10000

latency: 392.567 usec

solaris % lat_pipe 10000

latency: 266.572 usec

solaris % lat_pipe 10000

latency: 284.559 usec

Среднее для пяти попыток составляет 324 микросекунды, и именно это значение приведено в табл. А.1. Это время учитывает два переключения контекста (от родительского процесса к дочернему и обратно), четыре системных вызова (write, read, write, read) и затраты на передачу 1 байта данных по каналу.

Программа измерения задержки очередей сообщений Posix

Пpoгрaммa измерения задержки для очередей сообщений Posix приведена в листинге А.15.

Листинг А. 15. Программа измерения задержки для очереди сообщений Posix

//bench/lat_pxmsg.с

1 #include "unpipc.h"

2 #define NAME1 "lat_pxmsg1"

3 #define NAME2 "lat_pxmsg2"

4 #define MAXMSG 4 /* место для 4096 байт в очереди */

5 #define MSGSIZE 1024

6 void

7 doit(mqd_t mqsend, mqd_t mqrecv)

8 {

9 char buff[MSGSIZE];

10 Mq_send(mqsend, buff, 1.0);

11 if (Mq_receive(mqrecv, buff, MSGSIZE, NULL) != 1)

12 err_quit("mq_receive error");

13 }

14 int

15 main(int argc, char **argv)

16 {

17 int i, nloop;

18 mqd_t mq1, mq2;

19 char buff[MSGSIZE];

20 pid_t childpid;

21 struct mq_attr attr;

22 if (argc != 2)

23 err_quit("usage: lat_pxmsg <#loops>");

24 nloop = atoi(argv[1]);

25 attr.mq_maxmsg = MAXMSG;

26 attr.mq_msgsize = MSGSIZE;

27 mq1 = Mq_open(Px_ipc_name(NAME1), O_RDWR | O_CREAT, FILE_MODE, &attr);

28 mq2 = Mq_open(Px_ipc_name(NAME2), O_RDWR | O_CREAT, FILE_MODE, &attr);

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

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

31 if (Mq_receive(mq1, buff, MSGSIZE, NULL) != 1)

32 err_quit("mq_receive error");

33 Mq_send(mq2, buff, 1.0);

34 }

35 exit(0);

36 }

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

38 doit(mq1, mq2);

39 Start_time;

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

41 doit(mq1, mq2);

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

43 Kill(childpid, SIGTERM);

44 Mq_close(mq1);

45 Mq_close(mq2);

46 Mq_unlink(Px_ipc_name(NAMED);

47 Mq_unlink(Px_ipc_name (NAME2));

48 exit(0);

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

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

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII

И.Бабель. Воспоминания современников

Паустовский Константин Георгиевич
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
И.Бабель. Воспоминания современников

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Глэрд VIII: Базис 2

Владимиров Денис
8. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Глэрд VIII: Базис 2

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

Сильнейший Столп Империи. Книга 2

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

Сильнейший Столп Империи. Книга 4

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

Запрети любить

Джейн Анна
1. Навсегда в моем сердце
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Запрети любить

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Linux программирование в примерах

Роббинс Арнольд
Компьютеры и Интернет:
программирование
ос и сети
5.00
рейтинг книги
Linux программирование в примерах

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

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

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

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