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

Linux

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

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

Типичный результат запроса показан на следующем рисунке:

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

Большинство этих потоков запросов или процессов находятся в фазе ожидания, и лишь некоторые из них получают данные. Таким образом, это очень ресурсоемко, и управление этими потоками или процессами также является проблемой.

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

Или изображение ниже:

выбрать, опрос, epoll

select, poll и epoll — все это конкретные реализации мультиплексирования ввода-вывода, и они появляются по порядку.

select был первой реализацией (в BSD примерно в 1983 году).

После того, как был реализован select, было обнаружено много проблем, а затем в 1997 году был реализован poll, и select был улучшен, Select и poll очень похожи.

Позднее, в 2002 году, были внесены серьезные улучшения в реализацию epoll.

Epoll очень отличается от выбора / опроса:

Например, поток обработки select/poll выглядит следующим образом:

Процесс обработки epoll выглядит следующим образом:

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

Итак, как это достигается?

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

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

Результаты результат:

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

Для получения более интересного контента, пожалуйста, обратите внимание на мой публичный аккаунт WeChat.互联网技术窝Или добавьте WeChat для обсуждения и общения:

использованная литература: