Читать «UNIX: взаимодействие процессов» онлайн - страница 306
Уильям Ричард Стивенс
Таблица А.7. Время увеличения счетчика в разделяемой памяти для Digital Unix 4.0B (в секундах)
Количество процессов | Семафор Posix в памяти | Именованный семафор Posix | Семафор System V | Семафор System V с UNDO | Блокировка записей fcntl |
---|---|---|---|---|---|
1 | 12,8 | 12,5 | 30,1 | 49,0 | 98,1 |
2 | 664,8 | 659,2 | 58,6 | 95,7 | 477,1 |
3 | 1236,1 | 1269,8 | 96,4 | 146,2 | 1785,2 |
4 | 1772,9 | 1804,1 | 120,3 | 197,0 | 2582,8 |
5 | 2179,9 | 2196,8 | 147,7 | 250,9 | 3419,2 |
А.З. Измерение полосы пропускания: программы
В этом разделе приведены тексты трех программ, измеряющих полосу пропускания каналов, очередей сообщений Posix и System V. Результаты работы этих программ приведены в табл. А.2 и А.З.
Измерение полосы пропускания канала
На рис. А.7 приведена схема описываемой программы.
Рис. А.7. Схема программы измерения полосы пропускания канала
В листинге А.1 приведен текст первой половины программы bw_pipe, измеряющей полосу пропускания канала.
Листинг А.1. Функция main, измеряющая полосу пропускания канала
//bench/bw_pipe.c
1 #include "unpipc.h"
2 void reader(int, int, int);
3 void writer(int, int);
4 void *buf;
5 int totalnbytes, xfersize;
6 int
7 main(int argc, char **argv)
8 {
9 int i, nLoop, contpipe[2], datapipe[2];
10 pid_t childpid;
11 if (argc != 4)
12 err_quit("usage: bw_pipe <#loops> <#mbytes> <#bytes/write>");
13 nloop = atoi(argv[1]);
14 totalnbytes = atoi(argv[2]) * 1024 * 1024;
15 xfersize = atoi(argv[3]);
16 buf = Valloc(xfersize);
17 Touch(buf, xfersize);
18 Pipe(contpipe);
19 Pipe(datapipe);
20 if ((childpid = Fork()) == 0) {
21 writer(contpipe[0], datapipe[1]); /* child */
22 exit(0);
23 }
24 /* 4parent */
25 Start_time();
26 for (i = 0; i < nloop; i++)
27 reader(contpipe[1], datapipe[0], totalnbytes);
28 printf("bandwidth: %.3f MB/sec\n",
29 totalnbytes / Stop_time() * nloop);
30 kill(childpid, SIGTERM);
31 exit(0);
32 }
Аргументы командной строки
11-15 Аргументы командной строки задают количество повторов (обычно 5), количество передаваемых мегабайтов (если указать 10, будет передано 10×1024×1024 байт) и количество байтов для каждой операции read и write (которое может принимать значения от 1024 до 65536 в наших измерениях).
Выделение буфера и помещение начального значения
16-17 Вызов valloc аналогичен malloc, но выделяемая память начинается с границы страницы памяти. Функция touch (листинг А.3) помещает 1 байт данных в каждую страницу буфера, заставляя ядро считать в память все страницы данного буфера. Мы всегда выполняем это перед проведением измерений.