Распределение клиентских соединений между дочерними процессами

Распределение клиентских соединений между дочерними процессами

Следующей темой обсуждения является распределение клиентских соединений между свободными дочерними процессами, блокированными в вызове функции accept. Для получения этой информации мы модифицируем функцию main, размещая в совместно используемой области памяти массив счетчиков, которые представляют собой длинные целые числа (один счетчик на каждый дочерний процесс). Это делается следующим образом:

long *cptr, *meter(int); /* для подсчета количества клиентов на один

дочерний процесс */

cptr = meter(nchildren); /* перед порождением дочернего процесса */

В листинге 30.10 показана функция meter.

Листинг 30.10. Функция meter, которая размещает массив в совместно используемой памяти

//server/meter.c

 1 #include "unp.h"

 2 #include <sys/mman.h>

 3 /* Размещаем массив "nchildren" длинных целых чисел

 4  * в совместно используемой области памяти.

 5  * Эти числа используются как счетчики количества

    * клиентов, обслуженных данным дочерним процессом,

 6  * см. с. 467-470 книги [110]"

 7  */

 8 long*

 9 meter(int nchildren)

10 {

11  int fd;

12  long *ptr;

13 #ifdef MAP_ANON

14  ptr = Mmap(0, nchildren * sizeof(long), PROT_READ | PROT_WRITE,

15   MAP_ANON | MAP_SHARED, -1, 0);

16 #else

17  fd = Open("/dev/zero", O_RDWR, 0);

18  ptr = Mmap(0, nchildren * sizeof(long), PROT_READ | PROT_WRITE,

19   MAP_SHARED, fd, 0);

20  Close(fd);

21 #endif

22  return (ptr);

23 }

Мы используем неименованное отображение в память, если оно поддерживается (например, в 4.4BSD), или отображение файла /dev/zero (например, SVR4). Поскольку массив создается функцией mmap до того, как родительский процесс порождает дочерние, этот массив затем используется совместно родительским и всеми дочерними процессами, созданными функцией fork.

Затем мы модифицируем нашу функцию child_main (см. листинг 30.9) таким образом, чтобы каждый дочерний процесс увеличивал значение соответствующего счетчика на единицу при завершении функции accept, а после завершения выполнения всех дочерних процессов обработчик сигнала SIGINT выводил бы упомянутый массив счетчиков.

В табл. 30.2 показано распределение нагрузки по дочерним процессам. Когда свободные дочерние процессы блокированы вызовом функции accept, имеющийся в ядре алгоритм планирования равномерно распределяет нагрузку, так что в результате все дочерние процессы обслуживают примерно одинаковое количество клиентских запросов.

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

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

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

Взаимные исключения Posix между процессами

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Взаимные исключения Posix между процессами Функция main первой программы использует взаимное исключение Posix для обеспечения синхронизации. Текст ее приведен в листинге А.32.Листинг А.32. Функция main для измерения быстродействия взаимных исключений между


ГЛАВА 11 Взаимодействие между процессами

Из книги Сетевые средства Linux автора Смит Родерик В.

ГЛАВА 11 Взаимодействие между процессами В главе 6 было показано, как создавать процессы и управлять ими, тогда как главы 7—10 были посвящены описанию методов управления потоками, которые выполняются внутри процессов, и объектов, обеспечивающих их синхронизацию. Вместе с


Прием клиентских запросов соединения

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Прием клиентских запросов соединения Наконец, сервер может ожидать соединения с клиентом, используя функцию accept, возвращающую новый подключенный сокет, который будет использоваться в операциях ввода/вывода. Заметьте, что исходный сокет, который теперь находится в


Пример: подготовка и получение клиентских запросов соединения

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Пример: подготовка и получение клиентских запросов соединения Ниже приводится фрагмент кода, показывающий, как создать сокет и организовать прием клиентских запросов соединения.В этом примере используются две стандартные функции: htons ("host to network short" — "ближняя связь") и


Использование клиентских средств NTP

Из книги Операционная система UNIX автора Робачевский Андрей М.

Использование клиентских средств NTP Ранее уже шла речь о том, что при формировании сети можно расположить на одном из компьютеров сервер NTP, который получал бы информацию о времени от внешнего сервера, и настроить остальные компьютеры так, чтобы они обращались за этой


Настройка клиентских машин для использования AMANDA

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

Настройка клиентских машин для использования AMANDA AMANDA осуществляет резервное копирование, инициируемое сервером, поэтому на компьютере, выступающем в роли клиента, должна выполняться программа-сервер. Данная программа, предназначенная для работы в системах Linux и UNIX,


Поддержка "живых" клиентских наборов

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Поддержка "живых" клиентских наборов Многие клиентские интерфейсы реализуют классы наборов данных или наборов записей, которые получают выходные наборы от операторов SELECT. Такие клиентские классы обычно предоставляют методы DML, которые выбирают одну строку из буфера,


Русификация клиентских приложений InterBase

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

Русификация клиентских приложений InterBase Разобравшись с русификацией баз данных InterBase и с тем, как обеспечить хранение и интерпретацию символов на уровне базы данных, необходимо рассмотреть вопрос о том, как сделать так, чтобы клиентские приложения могли корректно читать


Использование IBProvider в клиентских приложениях

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

Использование IBProvider в клиентских приложениях Низкоуровневые прикладные интерфейсы для работы с СУБД (API) обычно не используются в клиентских приложениях из-за большого объема кода, необходимого для подготовки и выполнения SQL-запросов. Это относится и к OLE DB-интерфейсам.


Использование скриптов в клиентских приложениях базы данных InterBase

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

Использование скриптов в клиентских приложениях базы данных InterBase Время от времени у любого программиста появляется желание вынести часть логики своих приложений на уровень, который можно было бы изменять без перекомпиляции приложения. А для определенного класса задач


Взаимодействие между процессами

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

Взаимодействие между процессами Как уже обсуждалось, в UNIX процессы выполняются в собственном адресном пространстве и по существу изолированы друг от друга. Тем самым сведены к минимуму возможности влияния процессов друг на друга, что является необходимым в


Распределение клиентских соединений между дочерними процессами

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

Распределение клиентских соединений между дочерними процессами Используя функцию, показанную в листинге 30.10, мы можем исследовать распределение клиентских запросов между свободными дочерними процессами. Результат показан в табл. 30.2. Операционная система распределяет