В этой главе мы рассматриваем девять различных способов устройства сервера и взаимодействие каждого из этих серверов с одним и тем же клиентом. Клиент-серверный сценарий типичен для WWW: клиент посылает небольшой по объему запрос, а сервер отвечает ему, отсылая соответствующие запросу данные. Некоторые из этих серверов мы уже достаточно подробно обсуждали (например, параллельный сервер, вызывающий функцию fork
для обработки каждого клиентского запроса), в то время как предварительное создание процессов и потоков являются новыми для нас концепциями, которые и будут подробно рассмотрены в этой главе.
Мы запускали различные экземпляры клиента с каждым сервером, измеряя время, которое процессор тратит на обслуживание определенного количества клиентских запросов. Чтобы информация об этом не оказалась рассеянной по всей главе, мы свели все полученные результаты в табл. 30.1, на которую в этой главе будем неоднократно ссылаться. Следует отметить, что значения времени, указанные в этой таблице, соответствуют процессорному времени, затраченному
Таблица 30.1. Сравнительные значения времени, затраченного каждым из обсуждаемых в данной главе сервером
Описание сервера | Время центрального процессора на управление процессом | |
---|---|---|
0 | Последовательный (точка отсчета; затраты на управление процессом отсутствуют) | 0,0 |
1 | Параллельный сервер, один вызов функции fork для обработки одного клиента | 20,90 |
2 | Предварительное создание дочерних процессов, каждый из которых вызывает функцию accept | 1,80 |
3 | Предварительное создание дочерних процессов с блокировкой для защиты accept | 2,07 |
4 | Предварительное создание дочерних процессов с использованием взаимного исключения для защиты accept | 1,75 |
5 | Предварительное создание дочерних процессов, родительский процесс передает дочернему дескриптор сокета | 2,58 |
6 | Параллельный сервер, создание одного потока на каждый клиентский запрос | 0,99 |
7 | Предварительное создание потоков с использованием взаимного исключения для защиты accept | 1,93 |
8 | Предварительное создание потоков, главный поток вызывает accept | 2,05 |
Все приведенные выше значения времени были получены путем запуска клиента, показанного в листинге 30.1, на двух различных узлах в той же подсети, что и сервер. Во всех тестах оба клиента порождали пять дочерних процессов для создания пяти одновременных соединений с сервером, таким образом максимальное количество одновременных соединений с сервером было равно 10. Каждый клиент запрашивал 4000 байт данных от сервера по каждому соединению. В случае, когда тест подразумевает предварительное создание дочерних процессов или потоков при запуске сервера, их количество равно 15.
Некоторые версии нашего сервера работали с предварительно созданным пулом потоков или процессов. Интересным моментом является распределение клиентских запросов по потокам или дочерним процессам, находящимся в накопителе. В табл. 30.2 показаны варианты этого распределения, которые также будут обсуждаться в соответствующих разделах.
Таблица 30.2. Количество клиентов, обслуженных каждым из 15 дочерних процессов или потоков
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии