предисловие
Привет всем, яУлитка программист. Давайте учиться вместе сегодняМодель ввода-вывода. Прежде чем начать эту статью, позвольте задать вам несколько вопросов~
Что такое ИО? Что блокирует неблокирующий ввод-вывод? Что такое синхронный асинхронный ввод-вывод? Что такое мультиплексирование ввода-вывода? Какое отношение select/epoll имеет к модели IO? Сколько существует классических моделей ввода-вывода? В чем разница между BIO, NIO и AIO?
Если вы сможете хорошо ответить на эти вопросы, то поздравляю, ваше мастерство IO уже на высоте! Затем вы читаете эту статью с братом Тяньлуо, перечитываете ее еще раз и углубляете свое впечатление! Если вы неоднозначно относитесь к этим вопросам, ничего страшного, просто прочитайте эту статью, и вы все поймете!
- Нет публики:маленький мальчик собирает улиток
Что такое ИО?
IO, полное английское название Input/Output, что переводится какввод, вывод. Обычно мы довольно много слышим, что такое дисковый ввод-вывод, сетевой ввод-вывод. Так что же такое ИО? Есть ли какое-то чувство невежества? Кажется, я знаю, что это такое, но, кажется, я не могу ясно объяснить это.
ввод, вывод, в конце концов, кто вход? Кто на выходе? IO (ввод/вывод), если его вынести за пределы основного корпуса, может сбить с толку.
компьютер ввода-вывода
Мы часто говорим о вводе и выводе, что означает более интуитивно.компьютерный ввод и вывод,компьютер является предметом. Ты все еще помнишь тот колледж?Принципы компьютерной композициикогда естьструктура фон Неймана, который делит компьютер на пять частей: арифметический блок, контроллер, память, устройство ввода и устройство вывода.
Входное устройство представляет собой устройство, клавиатуру и мышь для ввода данных и информации к компьютеру. Устройство вывода - это терминальное устройство компьютерной аппаратной системы, которая используется для приема выходного дисплея компьютерных данных, общий дисплей, Принтер принадлежит к выходу устройства.
Например, если вы нажмете несколько раз на мышке и клавиатуре, он отправит ваши данные команды на хост-компьютер. После того, как хост-компьютер передает расчет, он выводит возвращенную информацию о данных на дисплее.
Мышь и монитор — это всего лишь вход и выход интуитивно понятной поверхности. Вернемся к компьютерной архитектуре.Процесс, связанный с миграцией данных между ядром компьютера и другими устройствами, называется вводом-выводом.. Например, дисковый ввод-вывод — это чтение данных с диска в память, что считается входом, соответственно данные из памяти записываются на диск, который является выходом. В этом суть ИО.
ОС ввода-вывода
Если бы мы записывали данные из памяти на диск, каким было бы тело? Субъектом может быть приложение, такое как процесс Java (при условии, что двоичный поток поступает по сети, процесс Java может записать его на диск).
операционная системаОтвечает за управление компьютерными ресурсами и планирование процессов. Приложения, работающие на нашем компьютере, действительно должны пройти черезоперационная система, вы можете выполнять специальные операции, такие какДисковый файл для чтения и записи, память для чтения и записии т.п. Поскольку это относительно опасные операции, они не могут быть испорчены приложением, а могут быть переданы только основной операционной системе. То есть, если ваше приложение хочет записать данные на диск, оно может работать, только вызывая API, открытый операционной системой.
- Что такое пользовательское пространство? Что такое пространство ядра?
- Взяв в качестве примера 32-разрядную операционную систему, она выделяет 4 ГБ (2 в 32-й степени) пространства памяти для каждого процесса. Доступное пространство памяти 4G разделено на две части: одна — пространство пользователя, а другая — пространство ядра. Пространство ядра — это область, к которой обращается ядро операционной системы и которое представляет собой защищенное пространство памяти, а пространство пользователя — это область памяти, к которой обращаются пользовательские приложения.
Наше приложение работает в пользовательском пространстве, в нем нет существенного процесса ввода-вывода, реальный ввод-вывод находится воперационная системареализовано. То есть операция ввода/вывода приложения делится на два действия:Вызов ввода-вывода и выполнение ввода-вывода. Вызов ввода-вывода инициируется процессом (рабочее состояние приложения), а выполнение ввода-выводаядро операционной системыработай. Упомянутый здесь ввод-вывод является триггером приложения к функции ввода-вывода операционной системы, то есть вызовом ввода-вывода.
Процесс ввода-вывода операционной системы
Операция ввода-вывода, инициируемая приложением, состоит из двух этапов:
- Вызов IO: процесс приложения к операционной системеядроПозвонить.
- Выполнение ввода-вывода: ядро операционной системы завершает операцию ввода-вывода.
Завершение операции ввода-вывода ядром операционной системы также включает два процесса:
- Фаза подготовки данных: ядро ожидает, пока устройство ввода-вывода будет готово для данных.
- Фаза копирования данных: копирование данных из буфера ядра в буфер пользовательского пространства.
На самом деле IO — это не передача внутренних данных процесса на внешнее устройство или миграция данных внешнего устройства на внутренний процесс. Внешние устройства обычно относятся к жестким дискам и сетевым картам для связи через сокеты. полныйпроцесс ввода-выводаОн включает в себя следующие шаги:
- Процесс приложения инициируется в операционной системеЗапрос IO-вызова
- операционная системаПодготовить данные, загрузите данные внешнего устройства ввода-вывода вбуфер ядра
- Операционная система копирует данные, то есть данные из буфера ядра копируются в буфер процесса.
Блокирующая модель ввода-вывода
Мы уже знаем, что IO есть, но что такоеблокировка ввода-выводаШерстяная ткань?
Предположим, что процесс приложения инициируетсяIO-вызов,но еслиДанные ядра еще не готовыЕсли процесс подачи заявкиблокировка ожидания, подождите, пока данные ядра будут готовы, скопируйте из ядра в пространство пользователя, а затем верните успешное приглашение.Эта операция ввода-вывода называетсяблокировка ввода-вывода.
- Классическим применением блокирующего ввода-вывода являетсяБлокирующий сокет, Java BIO.
- Недостаток блокировки ввода-вывода заключается в том, что если данные ядра не готовы, пользовательский процесс будет все время блокироваться.потраченная впустую производительность,можно использоватьнеблокирующий ввод-выводоптимизация.
Неблокирующая модель ввода-вывода
Если данные ядра не готовы, можно сначала вернуть сообщение об ошибке пользовательскому процессу, чтобы ему не нужно было ждать, а запросить еще раз путем опроса. Это неблокирующий ввод-вывод, блок-схема выглядит следующим образом:
Процесс неблокирующего ввода-вывода выглядит следующим образом:
- Процесс приложения инициирует ядро операционной системы
recvfrom
Прочитать данные. - Данные ядра операционной системы не готовы, немедленно верните
EWOULDBLOCK
код ошибки. - Приложение опрашивает вызов и продолжает выдавать в ядро операционной системы
recvfrom
Прочитать данные. - Данные ядра операционной системы готовы, скопированы из буфера ядра в пространство пользователя.
- Завершите вызов и верните сообщение об успешном завершении.
Неблокирующая модель ввода-вывода, называемаяNIO,Non-Blocking IO
. По сравнению с блокирующим вводом-выводом, хотя он значительно повышает производительность, он все же существует.проблемы с производительностью,Прямо сейчасчастый опрос, что приводит к частым системным вызовам, которые также потребляют много ресурсов ЦП. Можно рассмотреть этоМодель повторного использования ввода-вывода, Для решения этой проблемы.
Модель мультиплексирования ввода-вывода
теперь, когдаNIOНеверный опрос приведет к потреблению ресурсов ЦП. Мы ждем, пока данные ядра будут готовы, и активно уведомляем процесс приложения о выполнении системного вызова. Разве это не хорошо?
Перед этим давайте рассмотрим, что естьфайловый дескриптор fd(файловый дескриптор), который является термином в информатике, формально неотрицательным целым числом. Когда программа открывает существующий файл или создает новый файл, ядро возвращает процессу дескриптор файла.
Основная идея модели повторного использования ввода-вывода: система предоставляет намкласс функций(Поскольку мы погружаемся вВыберите, опрос, epollФункция), которая может контролировать множествоfd
операция, любая из них возвращает данные ядра в состояние готовности, и процесс приложения начинается сноваrecvfrom
системный вызов.
Выбор мультиплексирования ввода-вывода
Процесс приложения может отслеживать несколько одновременно, вызывая функцию выбораfd
,существуетselect
мониторинг функцийfd
, пока любое состояние данных готово,select
Функция вернется в читаемое состояние, и процесс приложения запустится снова.recvfrom
Запрос на чтение данных.
В модели неблокирующего ввода-вывода (NIO) необходимоN
(N>=1) опрос системных вызовов, но с помощьюselect
Модель мультиплексирования ввода-вывода требует только инициирования системного вызова, что значительно оптимизирует производительность.
но,select
Есть несколько недостатков:
- Максимальное количество отслеживаемых соединений ввода-вывода ограничено, обычно 1024 в системах Linux.
- После того, как функция выбора возвращается, это делается путем обхода
fdset
, найти готовый дескрипторfd
. (Я знаю только, что есть события ввода-вывода, но я не знаю, какие потоки, поэтому проходим все потоки)
потому чтоЕсть ограничение на количество подключений, так позже было предложеноpoll. По сравнению с избранным,pollрешеноПроблема с лимитом подключений. Однако, как и при выборе и опросе, вам все равно нужно просмотреть файловый дескриптор, чтобы получить готовый результат.socket
. Если большое количество одновременно подключенных клиентов может иметь очень мало состояний готовности одновременно, по мере роста числа отслеживаемых дескрипторов,Эффективность также будет уменьшаться линейно.
Таким образом, классическая модель мультиплексированияepoll
рождение.
epoll мультиплексирования ввода-вывода
чтобы решитьselect/poll
Проблемы с моделями мультиплексированияepoll
Рождение, он использует управление событиями для достижения, блок-схема выглядит следующим образом:
epollпройти первымepoll_ctl()
Чтобы зарегистрировать одинfd
(файловый дескриптор), однажды основанный наfd
Когда все будет готово, ядро будет использовать механизм обратного вызова для быстрой активации этогоfd
, когда процесс вызываетepoll_wait()
быть уведомлен. удалено здесьперебирать файловые дескрипторысложная операция, но использованиеобратный вызов события слушателямеханизма. Вот где сияет epoll.
Подытожим разницу между select, poll и epoll.
select | poll | epoll | |
---|---|---|---|
базовая структура данных | множество | связанный список | Красно-черные деревья и двусвязные списки |
приготовься | траверс | траверс | обратный вызов события |
сложность события | O(n) | O(n) | O(1) |
Максимальное количество подключений | 1024 | неограниченный | неограниченный |
копия данных FD | Каждый раз, когда вызывается select, данные fd необходимо копировать из пространства пользователя в пространство ядра. | Каждый раз, когда вызывается опрос, данные fd необходимо копировать из пространства пользователя в пространство ядра. | Используя отображение памяти (mmap), нет необходимости часто копировать данные fd из пространства пользователя в пространство ядра. |
epollЗначительно оптимизирует эффективность выполнения операций ввода-вывода, но когда процесс вызываетepoll_wait()
еще могут заблокировать. Джан Цзянцзы: мне не нужно спрашивать вас, готовы ли ваши данные, просто сообщите мне, когда ваши данные будут готовы после того, как я сделаю запрос, и это родилосьМодель ввода-вывода драйвера сигналов.
Управляемая сигналами модель модели ввода-вывода
Управляемый сигналами ввод-вывод больше не использует активный запрос для подтверждения готовности данных, а отправляет сигнал ядру (вызовsigaction
при строительствеSIGIO
сигнал), то пользовательский процесс приложения может выполнять другие действия без блокировки. Когда данные ядра будут готовы, перейдитеSIGIO
Сигнал уведомляет процесс приложения о состоянии чтения, когда данные готовы. После того, как пользовательский процесс приложения получает сигнал, он немедленно вызываетсяrecvfrom
, чтобы прочитать данные.
Модель ввода-вывода, управляемая сигналом, после того, как процесс приложения отправляет сигнал, немедленно возвращается, не блокируя процесс. Это уже похоже на асинхронную операцию. Но если вы посмотрите на блок-схему выше,Когда обнаруживается, что данные копируются в буфер приложения, процесс приложения по-прежнему заблокирован. Оглядываясь назад, будь то BIO, NIO или управляемый сигналом, когда данные копируются из ядра в буфер приложения, они блокируются. Есть ли план оптимизации?AIO(настоящий асинхронный ввод-вывод)!
Асинхронный ввод-вывод (AIO) модели ввода-вывода
сказал ранееBIO,NIO和信号驱动
, когда данные копируются из ядра в буфер приложения, обаблокировать, поэтому ни один из них не является действительно асинхронным.AIO
Реализована неблокировка всего процесса IO, то есть после того, как прикладной процесс выдает системный вызов, он сразу же возвращается, ноСразу же возвращается не результат обработки, а аналогичный смысл успешной отправки. Когда данные ядра будут готовы, скопируйте данные в буфер пользовательского процесса и отправьте сигнал, чтобы уведомить пользовательский процесс о завершении операции ввода-вывода.
Процесс выглядит следующим образом:
Идея оптимизации Asynchronous IO очень проста. Вам нужно только отправить запрос на ядро только для завершения всех операций запроса состояния данных и копирования данных без блокировки и ожидания результата. В ежедневном развитии есть похожие бизнес-сценарии:
Например, пакетный перевод инициирован, но обработка перевода занимает много времени.В это время серверная часть может сначала уведомить интерфейсную часть об успешной отправке передачи, а затем уведомить интерфейсную часть о результате. после обработки результата.
Блокирующее, неблокирующее, синхронное, асинхронное разделение ввода-вывода
|Модель ИО | | --- | --- |---|---| |Блокирующая модель ввода-вывода |Синхронная блокировка | |Модель неблокирующего ввода/вывода |Синхронный неблокирующий | |Модель мультиплексирования ввода-вывода |Синхронная блокировка | |Модель ввода/вывода, управляемая сигналом |Синхронный неблокирующий | |Модель асинхронного ввода-вывода (AIO) |Асинхронный неблокирующий |
Популярный пример для понимания BIO, NIO, AIO
- Синхронная блокировка (blocking-IO), называемая BIO
- Синхронный неблокирующий (неблокирующий ввод-вывод), называемый NIO
- Асинхронный неблокирующий (асинхронный-неблокирующий-IO), называемый AiO
Классический пример жизни:
- Сяо Мин пошел есть кокосового цыпленка Тунжэня Сиджи, поэтому он стоял в очереди на час, а затем начал есть горячее. (BIO)
- Сяохун также пошла в Coconut Chicken Tongren Siji.Она увидела, что ей придется долго ждать, поэтому она пошла в торговый центр, и каждый раз, когда она шла вокруг, она бежала назад, чтобы посмотреть, не пришла ли ее очередь. Так что она закончила тем, что ходила по магазинам и ела кокосовую курицу. (NIO)
- Как и Сяо Хуа, я пошел есть курицу с кокосом. Поскольку он является старшим членом, менеджер магазина сказал, что вы можете пойти в торговый центр для случайной встречи. Я сразу же позвоню вам, когда будет место. Так что Сяохуа не нужно было сидеть и ждать, и ему не нужно было время от времени бегать назад, чтобы посмотреть, дождался ли он.В конце концов, он также съел вкусную кокосовую курицу (AIO)
наконец
Я надеюсь, что эта статья будет полезна для вас. Если в статье есть что-то, что вы считаете неправильным, вы можете упомянуть об этом, и давайте учиться и совершенствоваться вместе. Нет публики:маленький мальчик собирает улиток.