Greg Utas
Я ничего не знаю о Tomcat, поэтому я буду следовать вашему описанию и ответу, который вы получили на свой вопрос. первоначальный вопрос[^].
Я не знаю, для чего нужны все эти нити, но догадываюсь. Более одной нити на порт прослушивателя в этом нет необходимости. Одна нить может listen
для новых соединений, accept
их до какого-то предела, poll
все полученные сокеты для новых пакетов, recv
пакеты из этих сокетов и с помощью обратного вызова приложения собирают их в правильно оформленные сообщения, которые в конечном итоге помещаются в очередь в качестве рабочих элементов для рабочих потоков приложения.
Я могу назвать две причины, по которым на службу TCP приходится более одного потока. Во-первых, поток, который делает то, что я только что описал, может не получить достаточно процессорного времени, когда он борется с большим количеством других потоков. Таким образом, игра, в которую играют, состоит в том, чтобы создать больше потоков, чтобы получить больше процессорного времени. Это одна из радостей упреждающего и приоритетного планирования, и я написал статьи о том, почему это глупо. Но это то, что делает большинство систем, так что это не будет сюрпризом.
Во-вторых, работа приложения может выполняться непосредственно из этих потоков. То есть, система не имеет слой массового обслуживания между уровнем ввода-вывода и прикладным уровнем. Приложение не предоставляет свои собственные потоки, но вместо этого вызывается потоками, которые также обслуживают сокеты. Обычно это плохая конструкция, но она также объясняет существование всех этих потоков, особенно если приложения часто выполняют блокирующие операции (например, дисковый ввод-вывод или чтение/запись базы данных).
Это может дать вам некоторое представление о том, что может происходить. Если ввод-вывод не блокируется, то 200 потоков вполне могут обрабатывать 300 клиентов, если система работает так, как описано в предыдущем параграфе, при условии, что приложение не блокирует потоки так часто, что ни один из них не доступен для обработки входящей работы.