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

задняя часть

предисловие

  • Unix предлагает несколько моделей ввода-вывода, и какие они?
  • Каковы характеристики различных моделей ввода-вывода? В чем разница между ними?
  • Разница между блокирующим, неблокирующим, синхронным, асинхронным?
  • Почему epoll эффективен?

Обзор

Шаги, участвующие в нормальных входных операциях

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

Шаги, связанные с вводом сетевых данных

  • Ожидание поступления данных из сети, когда они приходят, они копируются в буфер ядра.
  • Копировать данные из буфера ядра в буфер приложения

Введение в модель ввода-вывода

Блокировка ввода-вывода

  • Использование системного вызова и ядро ​​было заблокировано до тех пор, пока данные не будут готовы, а затем позже скопированы из буфера ядра в пользовательский режим, ожидание того, что ядро ​​готовит это время, не может ничего сделать
  • Во время вызова функции на рисунке ниже она блокируется до тех пор, пока данные не будут готовы и скопированы из ядра в программу пользователя.Эта модель IO блокирует IO
  • Блокирующий ввод-вывод — самая популярная модель ввода-вывода.

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

  • Ядро вернет код ошибки, когда данные не готовы, и вызывающая программа не будет спать, а будет постоянно опрашивать ядро, чтобы узнать, готовы ли данные.
  • Когда вызывается функция на рисунке ниже, если данные не готовы, она не всегда блокирует, как блокирует IO, а возвращает код ошибки. Когда данные готовы, функция успешно возвращается.
  • Приложение выполняет циклический вызов такого неблокирующего дескриптора, называемого опросом.
  • Опрос неблокирующего ввода-вывода потребляет много ресурсов ЦП и обычно используется только в системах, которые специализируются на предоставлении определенной функции. Эта функция доступна, если установить неблокировку для свойства дескриптора сокета.

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

  • Аналогичен неблокирующему, за исключением того, что опрос выполняется не пользовательским потоком, а ядром.После того, как слушатель ядра проверит готовность данных, он вызывает функцию ядра для копирования данных в пользовательский режим.
  • Системный вызов select на рисунке ниже действует как прокси-класс, постоянно опрашивая все зарегистрированные в нем файловые дескрипторы, которым требуется ввод-вывод, и когда есть результат, сообщите результат прокси-функции recvfrom, и ее божество погаснет и получить его в личных данных
  • Мультиплексирование ввода-вывода имеет по крайней мере два системных вызова.Если есть только один прокси-объект, производительность не так хороша, как в предыдущей модели ввода-вывода, но поскольку он может отслеживать множество сокетов одновременно, производительность выше, чем у первых двух.
  • Мультиплексирование включает в себя:
    • Выберите: линейно сканируйте все дескрипторы файлов прослушивания, активны ли они или нет. Существует максимальный предел номера (1024 для 32-битных систем, 2048 для 64-битных систем)
    • poll: То же, что и select, но структура данных другая.Массив структур pollfd должен быть выделен и поддерживаться в ядре. Он не имеет ограничений по размеру, но требует много операций копирования.
    • epoll: используется вместо опроса и выбора, без ограничений по размеру. Используйте один файловый дескриптор для управления несколькими файловыми дескрипторами и используйте красно-черное древовидное хранилище. Он также заменяет опрос на основе событий. Дескриптор файла, зарегистрированный в epoll_ctl, активирует дескриптор файла с помощью механизма обратного вызова при запуске события. epoll_wait получит уведомление. Наконец, epoll также использует технологию сопоставления виртуальной памяти mmap, чтобы уменьшить накладные расходы на передачу данных в пользовательском режиме и в режиме ядра.

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

  • Используя сигналы, ядро ​​сигнализирует о готовности данных.
  • Сначала откройте сокет ввода-вывода, управляемый сигналом, и используйте системный вызов sigaction для установки обработчика сигнала.Ядро возвращается напрямую, не блокируя пользовательский режим.
  • Когда данные будут готовы, ядро ​​отправит сигнал SIGIO и начнет операцию ввода-вывода после получения сигнала.

Асинхронный ввод-вывод

  • Асинхронный ввод-вывод полагается на обработчики сигналов для уведомления
  • Однако разница между асинхронным вводом-выводом и предыдущей моделью ввода-вывода заключается в том, что предыдущие являются блокирующими и неблокирующими на этапе подготовки данных.Модель асинхронного ввода-вывода уведомляет о завершении операции ввода-вывода, а не о завершении подготовки данных.
  • Асинхронный ввод-вывод действительно неблокирующий.Основной процесс занимается только своими делами.Когда операция ввода-вывода завершена (данные успешно скопированы из буфера ядра в буфер приложения), данные обрабатываются через функцию обратного вызова .
  • Асинхронные функции ввода-вывода в unix начинаются с aio_ или lio_

Сравнение различных моделей ввода-вывода

  • Основное различие между предыдущими четырьмя моделями ввода-вывода заключается в первом этапе, а второй этап у них такой же: данные блокируются при копировании из буфера ядра в буфер вызывающей стороны!
  • Первые четыре типа операций ввода-вывода являются синхронными операциями ввода-вывода: операция ввода-вывода блокирует запрашивающий процесс до тех пор, пока операция ввода-вывода не будет завершена.
  • Асинхронный ввод-вывод: операции ввода-вывода не блокируют запрашивающий процесс.

Ссылаться на

«Сетевое программирование Unix», том 1

Категории