Измерение полосы пропускания канала

Измерение полосы пропускания канала

На рис. А.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.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.12.2 Открытие поименованного канала

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.12.2 Открытие поименованного канала Поименованный канал — это файл, имеющий почти такую же семантику, как и непоименованный канал, за исключением того, что этому файлу соответствует запись в каталоге и обращение к нему производится по имени. Процессы открывают


Синдром запястного канала

Из книги Как справиться с компьютерной зависимостью автора Краснова С В

Синдром запястного канала Синдром запястного канала в целом является травмой запястья. Для распознавания его сущности, разберемся в физиологии. Запястье — это место соединения лучевой и локтевой костей (костей предплечья) и восьми костей кисти (мелких костей ладони).


15.7. Разделение канала

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

15.7. Разделение канала Допустим, вам нужно настроить прокси-сервер таким образом, чтобы одна группа компьютеров могла работать с одной скоростью, а другая — с другой. Это может потребоваться, например, для разграничения пользователей, которые используют канал для работы,


Настройка канала RSS

Из книги Microsoft Windows SharePoint Services 3.0. Русская версия. Главы 9-16 автора Лондер Ольга

Настройка канала RSS Ранее в этой главе рассказывалось о том, как управлять оповещениями, которые являются отправляемыми по электронной почте уведомлениями о том, что содержимое списка или библиотеки SharePoint изменилось. Новая функция Outlook 2007 – поддержка каналов RSS (Really Simple


Результаты измерения полосы пропускания сообщений

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Результаты измерения полосы пропускания сообщений В табл. А.2 приведены результаты измерений на компьютере Sparc под управлением Solaris 2.6, а на рис. А.1 — график этих результатов.Как мы и предполагали, полоса пропускания увеличивается с размером сообщения. Поскольку во многих


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

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

А.З. Измерение полосы пропускания: программы В этом разделе приведены тексты трех программ, измеряющих полосу пропускания каналов, очередей сообщений Posix и System V. Результаты работы этих программ приведены в табл. А.2 и


Измерение полосы пропускания очереди сообщений Posix

Из книги Визуальное моделирование электронных схем в PSPICE автора Хайнеманн Роберт

Измерение полосы пропускания очереди сообщений Posix В листинге А.5 приведена функция main программы, измеряющей полосу пропускания очереди сообщений Posix. Листинг А.6 содержит функции reader и writer. Эта программа устроена аналогично предыдущей, измерявшей полосу пропускания


Программа измерения полосы пропускания очереди System V

Из книги Бесплатные разговоры через Интернет автора Фрузоров Сергей

Программа измерения полосы пропускания очереди System V В листинге А.7 приведен текст функции main, измеряющей полосу пропускания очередей сообщений System V, а в листинге А.8 —текст функций reader и writer.Листинг А.7. Функция main для измерения полосы пропускания очереди сообщений System


Программа измерения полосы пропускания дверей

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Программа измерения полосы пропускания дверей Программа измерения полосы пропускания интерфейса дверей сложнее, чем предыдущие, поскольку нам нужно вызвать fork перед созданием двери. Родительский процесс создает дверь и с помощью канала оповещает дочерний процесс о


Программа определения полосы пропускания Sun RPC

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Программа определения полосы пропускания Sun RPC Поскольку вызовы процедур в Sun RPC являются синхронными, для них действует то же ограничение, что и для дверей (см. выше). В данном случае проще создать две программы (клиент и сервер), поскольку они создаются автоматически


6.20.1 Полоса пропускания

Из книги автора

6.20.1 Полоса пропускания IP эффективно использует полосу пропускания. Датаграммы помещаются в очередь для пересылки в точку следующего попадания, как только станет доступна полоса пропускания (bandwidth; по традиции мы будем использовать термин "полоса пропускания", хотя


12.1. Эффективная полоса пропускания

Из книги автора

12.1. Эффективная полоса пропускания Прежде всего, используя указанные в журнале Elektor значения, определим путем моделирования эффективную 3-dB-полосу пропускания при выходной мощности 35 Вт и сопротивлении нагрузки RH равном 8 Ом.Возможно, некоторым незнакомо понятие


Полоса пропускания канала

Из книги автора

Полоса пропускания канала Следующая вкладка диалогового окна настроек (рис. 4.20) называется Bandwidth (Ширина звукового канала). Если у вас низкоскоростной Интернет, то настройка этого параметра для вас особенно важна. Например, когда вы используете IP-телефонию и одновременно


Флаги канала

Из книги автора

Флаги канала Когда мы вначале книги изучали сервер (в параграфе «Сервер»), мы упомянули, что функция ChannelCreate() принимает параметр flags (флаги); правда, тогда мы вместо этого параметра передавали нуль.Теперь пришло время более подробно изучить назначение параметра flags.


9.5.8. Ограничение канала

Из книги автора

9.5.8. Ограничение канала При организации доступа в Интернет очень часто требуется отдельным пользователям обеспечить большую скорость подключения. Как это сделать, когда по умолчанию все равноправны и могут работать на максимально доступной на данный момент скорости?


10.1.4. Режим канала данных

Из книги автора

10.1.4. Режим канала данных Мы уже говорили о том, что для работы с FTP-сервером необходимо два канала. Порт 21 является командным, и по нему передаются только FTP-команды. Для передачи файлов создается отдельное соединение. Этот процесс можно описать следующим