Обзор BIO, NIO, AIO

Java задняя часть Операционная система Linux

предисловие

В Java есть три модели IO: BIO, NIO, AIO. Прежде чем представить эти три модели ввода-вывода, нам необходимо представить концепции синхронизации, асинхронности и блокировки, а также неблокировки, а затем проанализировать BIO, NIO и AIO с точки зрения ОС Java и Linux.

Синхронный и асинхронный

Синхронизировать

Синхронизация - это когда звонок сделан,вызываемый абонентПеред необработанным завершением запроса вызов не возвращается.

Популярный пример, описывающий синхронизацию, выглядит так:

Когда вы позвоните владельцу книжного магазина, чтобы спросить, есть ли у него книга «Коллекция подсолнухов», если это механизм синхронизации, владелец книжного магазина скажет, подождите, «я проверю», а затем начнет проверять и проверять , и подождите, пока он не будет проверен (может быть, 5 секунд, это может быть день), чтобы сообщить вам результат (вернуть результат).

асинхронный

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

Популярный пример, описывающий асинхронность, выглядит так:

Что касается асинхронного механизма, то владелец книжного магазина прямо говорит вам, что я проверю, позвоню вам после проверки, а затем сразу бросит трубку (без возврата результата). После проверки он возьмет на себя инициативу позвонить вам. Здесь начальник перезванивает "перезванивая"

Вот ответ на этот вопрос на Zhihu:Ууху. Call.com/question/19…

Снова обобщить о синхронном и асинхронном:

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

блокирующий и не блокирующий

блокировать

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

неблокирующий

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

Книги или выше примеры:

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

Разница между синхронным, асинхронным и блокирующим и неблокирующим

Блокировка и синхронизация — это не одно и то же, синхронные, асинхронные и блокирующие, неблокирующие объекты — это разные вещи.Блокирующий, неблокирующий относится к вызывающему, синхронный, асинхронный относится к вызываемому

Обзор BIO, NIO, AIO

  • BIO(Blocking I/O): Bio - это традиционная синхронная блокирующая модель IO, соответствующий пакет Java.io, который предоставляет много функциональности IO, таких как входные и выходные потоки, операция файла. Также для операций IO в сетевом программировании (сокет связи) в.

  • NIO(New I/O): Nio - это синхронная неблокирующая модель ввода / вывода. Структура NIO была введена в Java 1.4. Он соответствует пакету Java.nio и предоставляет абстракции, такие как канал, селектор и буфер

  • AIO: AIO также является NIO 2. В Java 7 была представлена ​​улучшенная версия NIO, NIO 2, которая представляет собой асинхронную неблокирующую модель ввода-вывода.

5 моделей ввода/вывода Linux

Вышеприведенное кратко представляет три модели ввода-вывода в Java. Три модели предоставляют API-интерфейсы, связанные с вводом-выводом. При обработке файлов нижний уровень фактически реализуется операциями ввода-вывода на уровне операционной системы. Например, после Linux 2.6 в Java обе NIO и AIO реализуются через epoll, и такие понятия, как epoll, будут объяснены позже.

На самом деле в операционной системе Linux (Unix) существует пять моделей ввода-вывода, а именно:Блокирующая модель ввода-вывода,Неблокирующая модель IO,Модель повторного использования ввода-вывода,Модель ввода-вывода, управляемая сигналамиа такжеМодель асинхронного ввода-вывода, в то время как все 4 являются синхронными, только последний является асинхронным. Следующий анализ в основном относится кUNIX Network Programming Volume 1: Socket Networking API (3-е издание)введение в .

Блокирующая модель ввода-вывода — БИО

阻塞IO

Операция ввода обычно состоит из двух отдельных фаз:

  • дождитесь готовности данных
  • Копировать данные из ядра в процесс

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

Как видно из приведенного выше рисунка,Процесс подачи заявки через системный вызовrecvfromдля получения данных, и поскольку данные ядра не готовы, процесс приложения будет заблокирован до тех пор, пока ядро ​​не подготовит данные и не скопирует их из ядра в буфер процесса приложения или не вернет ошибку. Самая распространенная ошибка — когда системный вызов прерывается сигналом. Процессу блокируется вызов recvfrom до тех пор, пока он не вернется.

Модель блокирующего ввода-вывода в Linux соответствует модели BIO в Java.Основная реализация BIO заключается в вызове API операционной системы для выполнения, то есть в вызове сокета Socket операционной системы.

Модель неблокирующего ввода-вывода — NIO

非阻塞IO

Процесс приложений прошел системный вызовrecvfromПродолжайте взаимодействовать с ядром до тех пор, пока дейтаграмма ядра не будет готова, и если у ядра нет готовых данных, оно немедленно возвращаетEWOULDBLOCKошибка, отправьте повторно через некоторое времяrecvfromзапрос, во время которого процесс может заниматься другими делами без ожидания, это неблокировка.

Когда процесс приложения циклически вызываетrecvfrom, мы называем егоголосованиеПроцесс приложения непрерывно опросает ядро, чтобы увидеть, готова ли операция. Отображение Nio Java к операционной системе Linux - это модель, не блокирующая модель ввода / вывода, показанная выше

Модель мультиплексирования ввода/вывода

IO复用模型

Использование мультиплексирования ввода-выводаselect/poll/epollфункция, ввод-вывод нескольких процессов может быть зарегистрирован в одном и том жеselectВключено, когда пользовательский процесс вызывает этоselectчас,selectконтролировать все зарегистрированные IO,Если все данные, требуемые от мониторинга IO, не готовы, тоselectВызывающий процесс будет заблокирован, пока любой сокет IO-дейтаграммы становится доступным для чтения, то есть дейтаграмма готова,selectвозвращает условие, что сокет доступен для чтения, а затем вызываетrecvfromСкопируйте прочитанную дейтаграмму в буфер процесса приложения.

Важно подчеркнуть, что модель мультиплексирования ввода-вывода не включает неблокирующие, процесс выдаетselectПосле этого все операции ввода-вывода, которые были заблокированы в ожидании их прослушивания, готовы к возврату, подчеркивают состояние блокировки, а неблокирующих нет.

В Java NIO также может быть достигнуто мультиплексирование, в основном с помощью мультиплексоров.Selector, с здесьselectтип функции,SelectorКанал, зарегистрированный на нем, будет постоянно опрашиваться.Если на канале происходит событие чтения или записи, канал находится в состоянии готовности и будет опрашиваться селектором. Дополнительные сведения о мультиплексировании в Java NIO см. в соответствующих статьях.

Сценарии применения мультиплексирования ввода/вывода

Основные сценарии применения мультиплексирования ввода/вывода следующие:

  • Сервер должен обрабатывать несколько сокетов в состоянии прослушивания или нескольких состояниях подключения одновременно.
  • Серверу нужны сокеты, которые одновременно обрабатывают несколько сетевых протоколов.

Функция системного вызова для мультиплексирования ввода/вывода

В настоящее время функции системных вызовов, поддерживающие мультиплексирование ввода-вывода:select,pselect,poll,epoll. В сетевом программировании Linux он используется уже давно.selectДелайте опросы и уведомления о сетевых событиях. Однако из-за некоторых врожденных дефектов select его применение сильно ограничено, например, ограничено максимальное количество дескрипторов, открываемых одним процессом select. Окончательно выбран в Linux 2.6epollВместо select Java NIO и AIO используют внизу epoll. Дополнительные сведения о введении и использовании этих системных вызовов см.UNIX Network Programming Volume 1: Socket Networking API (3-е издание)

Модель ввода-вывода, управляемая сигналами

信号

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

Управляемый сигналами ввод-вывод не является асинхронным

Управляемый сигналами ввод-вывод является асинхронным на этапе подготовки данных: когда у ядра есть готовая дейтаграмма, процесс уведомляется, но он является синхронным, когда вызывается операция recvfrom для копирования данных, поэтому в целом весь процесс ввода-вывода не может быть асинхронный.

Модель асинхронного ввода-вывода — AIO

异步IO

вызов процесса приложенияaio_readФункция, которая передает дескриптор, указатель буфера, размера буфера и смещение файлов в ядро ​​и сообщает ядро, как уведомить процесс, когда вся операция завершена, то системный вызов возвращается немедленно, и при ожидании ожидания ввода / вывода Заполните, наш процесс не заблокирован, процесс может делать другие вещи, а затем ядро ​​начинает ждать, пока данные будут готовы. После того, как данные будут копировать данные в буфер процесса, и, наконец, уведомляют о том, что Вся операция IO была завершена.

AIO Java предоставляет API асинхронного канала, а базовой реализацией его операционной системы является эта модель асинхронного ввода-вывода.

Отличие от управляемого сигналом ввода/вывода

Основное отличие заключается в следующем: в управляемом сигналом вводе-выводе ядро ​​сообщает нам, когда начинать операцию ввода-вывода, а в модели асинхронного ввода-вывода ядро ​​уведомляет нас о завершении операции ввода-вывода.

Сравнение 5 моделей ввода/вывода

5

Как снова видно из приведенного выше рисунка, операция ввода-вывода в основном делится на два этапа:

  • Ожидание фазы подготовки дейтаграммы
  • этап копирования данных

Первые четыре модели ввода-вывода являются синхронными моделями ввода-вывода, почему они все синхронные, ведь все они заблокированы на втором этапе копирования данных, что приведет к блокировке всего процесса запроса, поэтому он является синхронным, а асинхронным Модель ввода-вывода не приводит к блокировке запрашивающего процесса.

резюме

Вышеприведенное кратко описывает пять моделей ввода-вывода в рамках BIO, NIO, AIO и Linux.Для более подробного ознакомления с моделью ввода-вывода см.UNIX Network Programming Volume 1: Socket Networking API (3-е издание)

Ссылки и благодарности