Модель ввода-вывода операционной системы и эволюция технологии опроса

Linux

Первоначально я хотел представить технологию опроса Node.js, но перед этим давайте разберемся с эволюцией режима ввода-вывода в операционной системе, что поможет понять это позже.Операционная система обычно имеет два этапа обработки ввода-вывода. .

  • Приложение сначала инициирует системный вызов и ожидает готовности данных
  • Копировать данные из буфера ядра в буфер приложения

Технический блог GitHub: Стек технологий Node.js

Быстрая навигация

Руководство по собеседованию

  • I/O复用轮询技术select和epoll的区别?,Ссылаться на:#

Синхронный блокирующий ввод-вывод

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

图片描述

Синхронный неблокирующий ввод-вывод

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

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

图片描述

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

В случае большого параллелизма соединения (Socket) два вышеперечисленных не подходят. Первый не может быть обработан, а второй может только ждать. Здесь используется мультиплексирование ввода-вывода. На следующем рисунке сравниваются первые два. , разделенный на два шага: сначала выберите готовые данные, затем вызовите recvfrom для выполнения реальных операций чтения и записи ввода-вывода. Его преимущество заключается в том, что один поток может обрабатывать несколько сокетов одновременно.

图片描述

Существует несколько режимов реализации мультиплексирования ввода/вывода:select,poll,epoll,kqueue

  • select

Решение принимается путем опроса и проверки флага, установленного в дескрипторе файла.Опрос Select эквивалентен поиску записи в базе данных без создания индекса и обхода всех сокетов, что является пустой тратой ресурсов ЦП. Кроме того, у Select есть ограничение: максимальное количество файловых дескрипторов, которые могут быть открыты одним процессом, может составлять только 1024. Тогда технология опроса, основанная на Select, может одновременно обрабатывать не более 1000 одновременных пропускных способностей.За последние 10 лет знаменитая проблема одновременного подключения C10K

  • poll

Принципиальной разницы в реализации между poll и select нет, в отличие от select, poll реализован на основе связанного списка, и максимальное количество ссылок не ограничено 1024. Однако, когда файловых дескрипторов слишком много, каждый вызов будет выполнять линейный обход ссылки, и производительность по-прежнему будет очень низкой.

  • epoll

Это наиболее эффективный механизм уведомления о событиях ввода/вывода в Linux.Максимальное ограничение на количество ссылок отсутствует.Благодаря механизму уведомления об обратном вызове, ссылка не проходит линейно для каждого вызова, так что эффективность не будет снижаться с увеличением файловые дескрипторы.

На машине с 1 ГБ памяти можно отслеживать около 100 000 портов, что намного превышает лимит выбора в 1024 порта, которые можно просматривать на сервере.cat /proc/sys/fs/file-max

  • kqueue

Подобно epoll, он существует только в FreeBSD (UNIX-подобная операционная система).

Сигнальный ввод-вывод

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

图片描述

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

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

Реализация асинхронного ввода-вывода была добавлена ​​после Linux 2.6.AIO, но немногие системы могут достичь этого.

图片描述

Разница между select и epoll

Если вы спросите о реализации технологии опроса, то, как правило, будет рассмотрена разница между select и epoll.

  • С точки зрения режима работы, select использует для поиска линейный обход.После того, как есть много ссылок, вы можете себе представить, сколько производительности потребляется для блокировки ссылки при каждом обходе большого массива. epoll не требует обхода и использует механизм обратного вызова, который можно рассматривать как HashTable, и блокировать объект очень быстро. Для дескриптора файла (максимальное количество подключений) выберите ограничение 1024, epoll не имеет этого ограничения, обычно количество подключений, которое может поддерживаться на машине с 1G памяти, составляет около 10 Вт.
  • С точки зрения поддержки операционной системы, текущий популярный высокопроизводительный веб-сервер Nginx основан на epoll для достижения высокого параллелизма.Конечно, если ваша ссылка небольшая, разница не слишком велика.Если это большой трафик, высокий параллелизм Ситуация Epoll пока остается предпочтительной моделью.

народный стиль

Народный стиль (встреча Сяо Мина с сестрой) для объяснения эволюции модели ввода-вывода операционной системы и технологии опроса.

故事标题: Встреча Сяомина с девушкой
情节介绍: Сяо Мин встретил девушку на культурной вечеринке в кампусе.Узнав только имя девушки и номер мобильного телефона, после нескольких дней упорных поисков, после тысяч гор и рек, она наконец вернулась к красоте!
演员介绍: Мужчина №1@小明, Женщина №1@сестра, Чуанчан@Дядя-опекун

  1. Синхронный блокирующий режим ввода/вывода

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

  1. Синхронный неблокирующий режим ввода/вывода

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

  1. Режим мультиплексирования ввода/вывода

    1. selectСяо Мин позвонил девочке у школьных ворот и доверил швейцару, дядюшке Селекту, помочь.
    2. pollОпрос аналогичен функции выбора. Разница в том, что для дядя-опроса нет ограничения в 1024, и вы можете придерживаться его все время. Однако когда дядя-опрос превышает 1024 и вы задаете все больше и больше вопросов, вы становитесь более истощены.
    3. epollСяомин позвонил, чтобы встретить девочку у школьных ворот, и доверил помощь охраннику дяде Эполю.Дядя Эполл не был там для каждого запроса.Было оговорено, что каждый должен иметь при себе студенческий билет при входе и выходе из школы. школьные ворота, чтобы дядя Ополл знал, кто была богиней Сяомин.После того, как дядя Эполл нашел богиню, уведомите Сяо Мина по телефону.
  2. Сигнальный режим ввода/вывода

Сяомин позвал встречать девушку у школьных ворот, в это время девушка ответила, что я не готова (несколько часов макияжа перед выходом...), в этот раз Сяомин не пошла, а пошла заниматься другими делами сначала и подождал, пока девушка будет готова. Я позвонил Сяо Мину, чтобы сообщить Сяо Мину, что я готов. Сяо Мин в это время подошел к школьным воротам, чтобы дождаться свидания с моей сестрой.

  1. Асинхронный режим ввода/вывода

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

Следующий раздел EventLoop в Node.js

Автор: май июнь
Связь:Вухуу. ИМО OC.com/article/285…
Источник: МООК
Github: Стек технологий Node.js

Справочное руководство