Измерение полосы пропускания канала
Измерение полосы пропускания канала
На рис. А.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 ",
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 недоступна.
Создание двух каналов
18-19 Создаются два канала: contpipe[0] и contpipe[1] используются для синхронизации процессов перед началом передачи, a datapipe[0] и datapipe[1] используются для передачи самих данных.
Вызов fork
20-31 Создается дочерний процесс, вызывающий функцию writer, а родительский процесс в это время вызывает функцию reader. Функция reader вызывается nlоор раз. Функция start_time вызывается непосредственно перед началом цикла, a stop_time — сразу после его окончания. Эти функции даны в листинге А.З. Полоса пропускания представляет собой количество байтов, переданных за все проходы цикла, поделенное на время, затраченное на передачу (stop_time возвращает количество микросекунд, прошедшее с момент запуска start_time). Затем дочерний процесс завершается сигналом SIGTERM и программа завершает свою работу. Вторая половина программы приведена в листинге А.2. Она состоит из функций reader и writer.
Листинг А.2. Функции reader и writer
//bench/bw_pipe.cvoid
33 void
34 writer(int contfd, int datafd)
35 {
36 int ntowrite;
37 for(;;) {
38 Read(contfd, &ntowrite, sizeof(ntowrite));
39 while (ntowrite > 0) {
40 Write(datafd, buf, xfersize);
41 ntowrite –= xfersize;
42 }
43 }
44 }
45 void
46 reader(int contfd, int datafd, int nbytes)
47 {
48 ssize_t n;
49 Write(contfd, &nbytes, sizeof(nbytes));
50 while ((nbytes > 0) &&
51 ((n = Read(datafd, buf, xfersize)) > 0)) {
52 nbytes –= n;
53 }
54 }
Функция writer
33-44 Функция writer представляет собой бесконечный цикл, вызываемый дочерним процессом. Он ожидает сообщения родительского процесса о готовности к приему данных, считывая целое число из управляющего канала. Это целое число определяет количество байтов, которое будет записано в канал данных. При получении этого числа дочерний процесс записывает данные в канал, отправляя их родителю. За один вызов write записывается xfersize байтов.
Функция reader
45-54 Эта функция вызывается родительским процессом в цикле. Каждый раз при вызове функции в управляющий канал записывается целое число, указывающее дочернему процессу на необходимость помещения соответствующего количества данных в канал данных. Затем функция вызывает read в цикле до тех пор, пока не будут приняты все данные.
Текст функций start_time, stop_time и touch приведен в листинге А.З.
Листинг А.З. Функции start_sime, stop_time и touch
//lib/timing.с
1 #include "unpipc.h"
2 static struct timeval tv_start, tv_stop;
3 int
4 start_time(void)
5 {
6 return(gettimeofday(&tv_start, NULL));
7 }
8 double
9 stop_time(void)
10 {
11 double clockus;
12 if (gettimeofday(&tv_stop, NULL) == –1)
13 return(0.0);
14 tv_sub(&tv_stop, &tv_start);
15 clockus = tv_stop.tv_sec * 1000000.0 + tv_stop.tv_usec;
16 return(clockus);
17 }
18 int
19 touch(void *vptr, int nbytes)
20 {
21 char *cptr;
22 static int pagesize = 0;
23 if (pagesize == 0) {
24 errno = 0;
25 #ifdef _SC_PAGESIZE
26 if ((pagesize = sysconf(_SC_PAGESIZE)) == –1)
27 return(-1);
28 #else
29 pagesize = getpagesize(); /* BSD */
30 #endif
31 }
32 cptr = vptr;
33 while (nbytes > 0) {
34 *cptr = 1;
35 cptr += pagesize;
36 nbytes –= pagesize;
37 }
38 return(0);
39 }
Текст функции tv_sub приведен в листинге А.4. Она осуществляет вычитание двух структур timeval, сохраняя результат в первой структуре.
Листинг А.4. Функция tv_sub: вычитание двух структур timeval
//lib/tv_sub.c
1 #include "unpipc.h"
2 void
3 tv_sub(struct timeval *out, struct timeval *in)
4 {
5 if ((out->tv_usec –= in->tv_usec) < 0) { /* out –= in */
6 --out->tv_sec;
7 out->tv_usec += 1000000;
8 }
9 out->tv_sec –= in->tv_sec;
10 }
На компьютере Sparc под управлением Solaris 2.6 при выполнении программы пять раз подряд получим следующий результат:
solaris % bw_pipe 5 10 65536
bandwidth: 13.722 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.781 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.685 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.665 MB/sec
solaris % bw_pipe 5 10 65536
bandwidth: 13.584 MB/sec
Каждый раз мы задаем пять циклов, 10 Мбайт за цикл и 65536 байт за один вызов write или read. Среднее от этих пяти результатов даст величину 13,7 Мбайт в секунду, приведенную в табл. А.2.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Флаги канала
Флаги канала Когда мы вначале книги изучали сервер (в параграфе «Сервер»), мы упомянули, что функция ChannelCreate() принимает параметр flags (флаги); правда, тогда мы вместо этого параметра передавали нуль.Теперь пришло время более подробно изучить назначение параметра flags.
5.12.2 Открытие поименованного канала
5.12.2 Открытие поименованного канала Поименованный канал — это файл, имеющий почти такую же семантику, как и непоименованный канал, за исключением того, что этому файлу соответствует запись в каталоге и обращение к нему производится по имени. Процессы открывают
9.5.8. Ограничение канала
9.5.8. Ограничение канала При организации доступа в Интернет очень часто требуется отдельным пользователям обеспечить большую скорость подключения. Как это сделать, когда по умолчанию все равноправны и могут работать на максимально доступной на данный момент скорости?
10.1.4. Режим канала данных
10.1.4. Режим канала данных Мы уже говорили о том, что для работы с FTP-сервером необходимо два канала. Порт 21 является командным, и по нему передаются только FTP-команды. Для передачи файлов создается отдельное соединение. Этот процесс можно описать следующим
15.7. Разделение канала
15.7. Разделение канала Допустим, вам нужно настроить прокси-сервер таким образом, чтобы одна группа компьютеров могла работать с одной скоростью, а другая — с другой. Это может потребоваться, например, для разграничения пользователей, которые используют канал для работы,
6.20.1 Полоса пропускания
6.20.1 Полоса пропускания IP эффективно использует полосу пропускания. Датаграммы помещаются в очередь для пересылки в точку следующего попадания, как только станет доступна полоса пропускания (bandwidth; по традиции мы будем использовать термин "полоса пропускания", хотя
Настройка канала RSS
Настройка канала RSS Ранее в этой главе рассказывалось о том, как управлять оповещениями, которые являются отправляемыми по электронной почте уведомлениями о том, что содержимое списка или библиотеки SharePoint изменилось. Новая функция Outlook 2007 – поддержка каналов RSS (Really Simple
Полоса пропускания канала
Полоса пропускания канала Следующая вкладка диалогового окна настроек (рис. 4.20) называется Bandwidth (Ширина звукового канала). Если у вас низкоскоростной Интернет, то настройка этого параметра для вас особенно важна. Например, когда вы используете IP-телефонию и одновременно
12.1. Эффективная полоса пропускания
12.1. Эффективная полоса пропускания Прежде всего, используя указанные в журнале Elektor значения, определим путем моделирования эффективную 3-dB-полосу пропускания при выходной мощности 35 Вт и сопротивлении нагрузки RH равном 8 Ом.Возможно, некоторым незнакомо понятие
Результаты измерения полосы пропускания сообщений
Результаты измерения полосы пропускания сообщений В табл. А.2 приведены результаты измерений на компьютере Sparc под управлением Solaris 2.6, а на рис. А.1 — график этих результатов.Как мы и предполагали, полоса пропускания увеличивается с размером сообщения. Поскольку во многих
А.З. Измерение полосы пропускания: программы
А.З. Измерение полосы пропускания: программы В этом разделе приведены тексты трех программ, измеряющих полосу пропускания каналов, очередей сообщений Posix и System V. Результаты работы этих программ приведены в табл. А.2 и
Измерение полосы пропускания очереди сообщений Posix
Измерение полосы пропускания очереди сообщений Posix В листинге А.5 приведена функция main программы, измеряющей полосу пропускания очереди сообщений Posix. Листинг А.6 содержит функции reader и writer. Эта программа устроена аналогично предыдущей, измерявшей полосу пропускания
Программа измерения полосы пропускания очереди System V
Программа измерения полосы пропускания очереди System V В листинге А.7 приведен текст функции main, измеряющей полосу пропускания очередей сообщений System V, а в листинге А.8 —текст функций reader и writer.Листинг А.7. Функция main для измерения полосы пропускания очереди сообщений System
Программа измерения полосы пропускания дверей
Программа измерения полосы пропускания дверей Программа измерения полосы пропускания интерфейса дверей сложнее, чем предыдущие, поскольку нам нужно вызвать fork перед созданием двери. Родительский процесс создает дверь и с помощью канала оповещает дочерний процесс о
Программа определения полосы пропускания Sun RPC
Программа определения полосы пропускания Sun RPC Поскольку вызовы процедур в Sun RPC являются синхронными, для них действует то же ограничение, что и для дверей (см. выше). В данном случае проще создать две программы (клиент и сервер), поскольку они создаются автоматически
Синдром запястного канала
Синдром запястного канала Синдром запястного канала в целом является травмой запястья. Для распознавания его сущности, разберемся в физиологии. Запястье — это место соединения лучевой и локтевой костей (костей предплечья) и восьми костей кисти (мелких костей ладони).