Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [ 155 ] 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186


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

System V

ровка

ние Posix

чтения-

памяти

семафор

с UNDO

записей

записи

Posix

fcntl

13,6

14,3

17,3

22,1

90,7

29,2

29,2

34,9

41,6

244,5

41,6

42,9

54,0

60,1

376,4

12,2

57,3

58,8

72,4

81,9

558,0

20,4

70,4

73,5

87,8

102,6

764,0

Таблица А.7. Время увеличения счетчика в разделяемой памяти для Digital

Unix 4.0В (в секундах)

Количество Семафор

Именованный

Семафор

Семафор

Блокиров-

процессов Posix в

семафор

System V

System V

ка записей

памяти

Posix

с UNDO

fcntl

1 12,8

12,5

30,1

49,0

98,1

2 664,8

659,2

58,6

95,7

477,1



Количество

Семафор

Именованный

Семафор

Семафор

Блокиров-

процессов

Posix в

семафор

System V

System V

ка записей

памяти

Posix

с UNDO

fcntl

1236,1

1269,8

96,4

146,2

1785,2

1772,9

1804,1

120,3

197,0

2582,8

2179,9

2196,8

147,7

250,9

3419,2

А.З. Измерение полосы пропускания: программы

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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 [ 155 ] 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.