Предыдущая статья《Модель ввода-вывода сетевого программирования на стороне сервера«Ядро высокопроизводительного сетевого программирования на стороне сервера лежит в архитектуре, а ядро архитектуры — в выборе модели процесса/потока. В этой статье в основном будут представлены традиционные и популярные в настоящее время модели процессов/потоков.Прежде чем говорить о модели процессов/потоков, необходимо представить шаблон проектирования: шаблон Reactor, если вы его не понимаете, см. здесьРежим реактора подробно", в тексте есть предложение, которое очень хорошо описывает режим Reactor, пожалуйста, процитируйте его.
Сначала режим Reactor управляется событиями, с одним или несколькими параллельными источниками ввода, одним обработчиком служб и несколькими обработчиками запросов; этот обработчик служб будет синхронно мультиплексировать входящий запрос (событие) и распределять его по соответствующему обработчику запросов. Если это показано на схеме следующим образом:
Интересно, обнаружил ли читатель, что режим Reactor очень похож на модель мультиплексирования ввода-вывода в модели ввода-вывода, а меня эти два понятия долгое время путали в процессе изучения сетевого программирования. Фактически, на уровне шаблона проектирования мультиплексирование ввода-вывода также использует шаблон Reactor. Модель мультиплексирования ввода-вывода можно рассматривать как применение шаблона Reactor к модели ввода-вывода, и сегодня мы поговорим о применении шаблона Reactor к модели процессов/потоков.
На мой взгляд, модель процесса/потока можно разделить на нереакторный режим и режим реактора (конечно есть еще режим проактора, в этой статье об этом говорить не буду, т.к. модели). Существует множество моделей процессов/потоков в режиме без реактора и в режиме реактора, которые будут перечислены позже. Модель процесса/потока не-реакторного режима — это традиционная модель, которая в настоящее время встречается редко, и помещена здесь в основном для того, чтобы читатели могли понять и сравнить с режимом процесса/потока режима Reactor.
Нереакторная модель процесса/потока
Традиционная модель не использует мультиплекс IO, так что есть больше проблем. Начинающие предполагают, что вы можете увидеть этот раздел, если вы чувствуете запутанные или не заинтересованные, вы можете пропустить эту часть, просто посмотрите на часть режима реактора. Но первое, 2 балла этого раздела нужно понять.
1. Одиночный процесс, один поток
Описание: Вся логика этой модели находится в процессе, включая установление соединения -> Чтение данных о соединении -> Бизнес-обработка -> Запись некоторых данных и продолжение цикла. Модель может обрабатывать только одно соединение за раз, что недоступно в реальных приложениях. Новичкам следует использовать эту модель при имитации примера «Unix Network Programming Volume I» для написания сетевых программ.Конечно, в примере обычно есть несколько действий Close connection после Write, чтобы не вызывать предыдущий дескриптор при обработке следующее соединение Уступи дорогу.
Преимущества: код прост, не нужно понимать концепцию процесса и потока, подходит для начинающих, изучающих сетевое программирование. Модель по умолчанию без знания модели процесса/потока.
Недостатки: Нет практической ценности.
2. Однопроцессная многопоточность
Описание: Процесс выполняет только действие по установлению соединения. Каждый раз, когда соединение получено, создается поток. можно уменьшить за счет использования пула потоков Создание и уничтожение потоков. Эта модель потоковой передачи имеет определенные сценарии применения.Биография трех моделей потоковой передачи Tomcat использует эту модель процесса/поточной обработки. Новички могут начать изучать эту модель после изучения модели с одним процессом и одним потоком и иметь представление о потоках, а также могут реализовать простую программу чата.
Преимущество: одновременно устанавливайте соединение с множеством клиента и обработаны отдельно принимающим сервис соединения разъема.
Недостатки: Каждое соединение занимает поток, что приводит к пустой трате ресурсов потока, когда нет данных о соединении, а количество соединений, которые можно установить, ограничено.
3. Многопроцессный один поток
описывать:
(1) Когда запустится основной процесс, создайте прослушивающий сокет и прослушайте, а затем разветвите N дочерних процессов.
(2) Из-за наследования родительского и дочернего процессов дочерний процесс также прослушивает порт, а затем мониторинг в родительском процессе закрывается.
(3) Родительский процесс отвечает за создание, уничтожение, восстановление ресурсов и т. д. дочернего процесса, а дочерний процесс отвечает за установление соединения->Чтение->Бизнес-обработка->Запись и т.д.
Так как все процессы прослушивают один и тот же порт, в этой модели будет относительно известное явление — явление шокирующего стада: когда приходит соединение, пробуждаются все дочерние процессы, но окончательно установить соединение с Клиентом может только один . , что приводит к пустой трате ресурсов (системное планирование также потребляет ресурсы ЦП). Однако, после Linux версии 2.6, группа panic была устранена в ядре, и когда приходит соединение, оно только разбудит процесс, ожидающий accept(). Даже если ядро не исправлено, на уровне приложения можно использовать блокировки для предотвращения роев.
Недостаток: эта модель является эволюционной версией одиночного процесса и одного потока, но она не очень полезна. И увеличить сложность разработки. Таким образом, не перечисляя ее преимуществ, введение этой модели в основном связано с введением концепции шокирующего стада, и аналогичная ситуация будет иметь место в случае многопроцессорности в следующей модели Reactor.
Модель процесса/потоков шаблона Reactor
Этот режим обычно представляет собой модель Reactor + мультиплексирование ввода-вывода, любая из следующих моделей имеет определенные практические сценарии.
1. Одиночный процесс, один поток
Описание: существует только один процесс, события на прослушивающем сокете и на подключающемся сокете обрабатываются Select,
(1) Если есть запрос на установление соединения, Акцептор отвечает за принятие и установление соединения с ним, а также добавление сокета соединения в Select для мониторинга;
(2) если соединение прочитало событие, выполняется чтение->обработка обслуживания->операции записи и т.п.;
(3) Этот цикл повторяется.
Преимущества: программирование простое, и оно может в основном удовлетворить сетевое программирование на стороне сервера в фоновом режиме с несложной бизнес-обработкой. Серверные программы старого клуба все в этом режиме, и основные причины следующие
(1) Если производительность одной машины неудовлетворительна, добавьте в кластер новую.
(2) Бизнес-процессы несложные.
(3) Если он расширен до многопроцессорности, то не имеет особого смысла, если он не многоядерный.
(4) Если используется многопоточность с одним процессом, потоки обработки в C++ не так просты, как в Java, и необходимо учитывать проблемы параллелизма, а соотношение преимуществ невелико.
Недостатки: быть перегруженным, при выполнении процессингового сервиса нельзя выполнять другие операции: устанавливать соединение, например читать данные и тому подобное на других сокетах.
2. Однопроцессная многопоточность
Описание. Как и в случае с одним процессом и одним потоком, разница в том, что эта модель помещает бизнес-обработку в потоки, и процесс не блокируется при бизнес-обработке.
Преимущества: Относительно совершенная модель процесса/потока и невысокая сложность реализации Java. На этом основаны многие сетевые библиотеки, такие как Netty.
Недостатки: Будет добавлено.
3. Многопроцессный один поток:
Описание: аналогично многопроцессорному одиночному потоку в режиме, отличном от Reactor, но в этом режиме используется мультиплексирование ввода-вывода в дочерних процессах, и практичность будет рассмотрена ниже. Знаменитый nginx использует эту модель процесса/потока.
Преимущества: Относительно просто программировать и использовать преимущества нескольких ядер. Он может соответствовать высокому параллелизму, иначе nginx не сможет принять этот режим.
Недостатки: ребенок все равно будет заблокирован на бизнес-процессах.
4. Многопроцессорная многопоточность
Описание: Графика здесь не рисуется, то есть бизнес-обработка передается многопоточной обработке на дочернем процессе, обратитесь к пулу потоков в однопроцессной многопоточности.
Преимущества: полное использование многоядерных одновременных подпроцессов без блокировки бизнес-процессов.
Недостаток: Сложное программирование.
5. Процесс master-slave + многопоточность:
Описание: в моделях процессов/потоков предыдущих режимов Reactor установление соединения, а также чтение и запись соединения выполняются в одном и том же процессе. В этой модели установление соединения, а также чтение и запись соединения размещаются в разных процессах.
(1) Выберите основной процесс, заблокированный на прослушивающем сокете, после запроса через установленное соединение с ним и соединитель сокета, который нужно передать от процесса.
(2) Ведомый процесс выбирает и блокирует сокет подключения.Как только есть данные о соединении, он выполняет чтение и обрабатывает бизнес через потоки. Также записывает данные в соединение при необходимости.
Преимущества: установление соединения, а также чтение и запись соединения разделены в разных процессах, и эффективность обработки будет выше. Эта модель немного лучше, чем многопоточная модель с одним процессом, и также может использовать преимущества нескольких ядер.
Недостаток: Сложное программирование.
Суммировать
Выше приведена общая модель процесса/потока.Модель потока, использующая мультиплексирование ввода-вывода, обычно может называться моделью Reactor, поэтому нет необходимости беспокоиться о взаимосвязи между мультиплексированием ввода-вывода и моделью Reactor. После перехода с C++ на Java, хотя сетевым программированием больше не занимался. Но после прочтения «Авторитетного руководства по Netty» я хочу рассказать о некоторых элементах, которые необходимо учитывать при проектировании сетевой библиотеки, исходя из моего предыдущего опыта работы, и в то же время поделиться некоторыми Netty. Он будет опубликован в следующих статьях, так что следите за обновлениями! Не забудьте обратить внимание на общедоступную учетную запись и записать путь обучения программиста на C++ Java.