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

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

Шрифт:

Рис. А.5. Время увеличения счетчика в разделяемой памяти (Solaris 2.6)

Рис. А.6. Время увеличения счетчика в разделяемой памяти 

Таблица А.6. Время увеличения счетчика в разделяемой памяти для Solaris 2.6 (в секундах) 

Кол-во процессов Взаимное исключение Posix Блокировка чтения-записи Семафор Posix в памяти Именованный семафор Posix Семафор System V Семафор System V с UNDO Блокировка записей fcntl
1 0,8 1,6 13,6 14,3 17,3 22,1 90,7
2 1,6 3,9 29,2 29,2 34,9 41,6 244,5
3 2,3 6,4 41,6 42,9 54,0 60,1 376,4
4 3,1 12,2 57,3 58,8 72,4 81,9 558,0
5 4,0 20,4 70,4 73,5 87,8 102,6 764,0

Таблица А.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 байт данных в каждую страницу буфера, заставляя ядро считать в память все страницы данного буфера. Мы всегда выполняем это перед проведением измерений.

ПРИМЕЧАНИЕ

Функция valloc не входит в стандарт Posix.1 и названа устаревшей в Unix 98. Она требовалась в ранних версиях спецификаций Х/Open, но уже не является необходимой. Обертка Valloc вызывает функцию malloc, если valloc недоступна.

  • Читать дальше
  • 1
  • ...
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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