Главная страница Взаимодействие нетривиальных процессов 1 2 3 4 5 количество процессов Рис. А.6. Время увеличения счетчика в разделяемой памяти Digital Unix 4,0В не поддерживает атрибут PTHREAD PROCESS SHARED, поэтому мы не можем измерить скорость работы взаимных исключений в этой системе. Для семафоров Posix в Digital Unix 4,0В опять наблюдаются аномалии. Таблица А.6. Время увеличения счетчика в разделяемой памяти для Solaris 2.6 (в секундах)
А.З. Измерение полосы пропускания: программы в этом разделе приведены тексты трех программ, измеряющих полосу пропускания каналов, очередей сообщений Posix и System V, Результаты работы этих программ приведены в табл, А,2 и А.З, Измерение полосы пропускания канала На рис, А,7 приведена схема описываемой программы. измеряется время выполнения этой функции родительский процесс дочерний процесс main ( ) { Pipe (contpipe); Pipe (datapipe); if(Fork() = = 0) { reader ( ); exit (0): reader ( ) Write (contpipe [1], ):-while (more to receive) Read (datapipe [0], );Л fork () управляющий канал: количество передаваемых данных канал данных данные main ( if (Fork С writer (); exit (0); } = = 0) { writer ( ) { >- Read (contpipe [0],); while (more to send) Write (datapipe [1],); Рис. A.7. Схема программы измерения полосы пропускания канала В листинге А.1 приведен текст первой половины программы bw pipe, измеряющей полосу пропускания канала. Листинг А.1. Функция main, измеряющая полосу пропускания канала bench/bw pipe.c 1 #include unpipc.h 2 void readerCint, int. int); продолжение ПРИМЕЧАНИЕ Функция valloc не входит в стандарт Posix.l и названа устаревшей в Unix 98. Она требовалась в ранних версиях спецификаций Х/Ореп, но уже не является необходимой. Обертка Valloc вызывает функцию malloc, если valloc недоступна. Листинг А.1 (продолжение) 3 void writer(int. int); 4 void *buf; 5 int totalnbytes, xfersize; 6 int 7 mainCint argc. char **argv) 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[l]); 14 totalnbytes = atoi(argv[2]) * 1024 * 1024; 15 xfersize = atoi(argv[3]): 16 buf = Valloc(xfersize); 17 TouchCbuf. xfersize): 18 Pipe(contpipe); 19 Pipe(datapipe); 20 if ( (childpid = ForkO) = 0) { 21 writer(contpipe[0], datapipe[l]); /* child */ 22 exitCO): 23 } 24 /* 4parent */ 25 Start time(); 26 for (i = 0: i < nloop; i++) 27 reader(contpipe[l], datapipe[0], totalnbytes): 28 printfCbandwidth: .3f MB/sec\n , 29 totalnbytes / Stop time() * nloop): 30 kill(childpid. SIGTERM); 31 exitCO): 32 } Аргументы командной строки 11-15 Аргументы командной строки задают количество повторов (обычно 5), количество передаваемых мегабайтов (если указать 10, будет передано 10х х1024х1024 байт) и количество байтов для каждой операции read и write (которое может принимать значения от 1024 до 65 536 в наших измерениях). Выделение буфера и помещение начального значения 16-17 Вызов val 1 ос аналогичен mai 1 ос, но выделяемая память начинается с границы страницы памяти. Функция touch (листинг А.З) помещает 1 байт данных в каждую страницу буфера, заставляя ядро считать в память все страницы данного буфера. Мы всегда выполняем это перед проведением измерений.
|
© 2000 - 2025 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |