предисловие
- 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