Аннотация: Понимание BIO и NIO
Недавно я, вероятно, посмотрел исходный код ZooKeeper и Mina и обнаружил, что они оба реализованы на Java NIO, поэтому важно понять, что такое NIO. Ниже приведён мой собственный резюме, основанный на онлайн-информации: чтобы сэкономить время, я нарисовал схему небрежно, если смогу достичь смысла.
Знакомство:
BIO: Синхронное блокирование IO, режим реализации сервера заключается в подключении одного потока за раз, то есть, когда у клиента есть запрос на соединение, сервер должен запустить поток для обработки, если это соединение ничего не даёт, это вызовет ненужные накладные расходы потоков, конечно, это можно улучшить через механизм пула потоков.
NIO: Синхронный неблокирующий выход, режим реализации сервера — это один запрос на поток, то есть запрос на подключение, отправленный клиентом, регистрируется на мультиплексоре, и мультиплексор запускает поток для обработки, когда соединение поступает запрос ввода-вывода.
AIO (NIO.2): Асинхронный неблокирующий IO, режим реализации сервера заключается в фактическом запросе одного потока, а запросы ввода-вывода клиента сначала выполняются ОС, а затем уведомляет серверное приложение о запуске потока для обработки.
БИОГРАФИЯ
Синхронный блокировочный вход, я считаю, что все, кто изучал сетевое программирование операционной системы или любой другой язык, знакомы: в цикле while сервер вызывает метод accept, чтобы дождаться запроса на соединение принимающего клиента. После получения запроса на соединение на этом сокете может быть установлен коммуникационный сокет для операций чтения и записи; в этот момент он больше не может принимать другие запросы на подключение клиента, может только ждать выполнения операции с текущим клиентом.
Если BIO хочет одновременно обрабатывать несколько клиентских запросов, он должен использовать многопоточность, то есть каждый раз, когда блоки приема ждут клиентского запроса, после получения запроса на соединение устанавливается коммуникационный сокет и открывается новый поток для обработки запроса на чтение и запись данных этого сокета, а затем сразу же продолжать принимать и ждать других запросов на подключение клиента, то есть для каждого запроса клиентского соединения создаётся поток, схема, вероятно, выглядит так:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Хотя сервер в данный момент имеет высокую параллельность, то есть может одновременно обрабатывать несколько клиентских запросов, это создаёт проблему: по мере увеличения числа открытых потоков он будет потреблять слишком много ресурсов памяти, что приводит к замедлению или даже сбоя сервера, и NIO может решить эту проблему в определённой степени.
NIO
Ключ к синхронному неблокирующему вводу — принять идею, основанную на событиях, для реализации мультиплексора.
Главное отличие между NIO и BIO в том, что нужно открыть поток только для обработки событий ввода-вывода от нескольких клиентов.
Это мультиплексор, способный прослушивать события ввода-вывода от нескольких клиентов:
A. Если сервер слушает запрос клиентского подключения, он установит для него сокет связи (канал на Java), а затем возвращается для продолжения прослушивания.
B. Если сервер слушает данные, отправленные клиентом, создавшим коммуникационный сокет, он вызовет соответствующий интерфейс для обработки полученных данных, и если одновременно работает несколько клиентов, данные могут быть обработаны по очереди.
C. Слушайте запросы нескольких клиентов на подключение и получение запросов на данные, а также когда у вас есть данные для отправки.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Короче говоря, в одном потоке вы можете вызвать мультиплексирующий интерфейс (выберите на java), чтобы блокировать и прослушивать запросы ввода-вывода от нескольких клиентов одновременно, и после получения запроса ввода-вывода будет вызвана соответствующая функция для его обработки.
Соответствующие сценарии применения
К этому моменту вы, возможно, заметили, что как только запрос поступает (будь то несколько одновременно или только один), будет вызвана соответствующая функция обработки ввода-вывода для его обработки, так что:
(1) NIO подходит для обработки сценариев с большим количеством соединений, но соединения относительно короткие (при лёгкой эксплуатации), такие как Jetty, Mina, ZooKeeper и др., все они реализованы на основе java nio.
(2) Метод BIO подходит для сценариев, когда количество соединений относительно мало и фиксировано, что требует больших ресурсов сервера и ограничено приложениями.
|