Читаем Linux API. Исчерпывающее руководство полностью

Вызов select() традиционно является более популярным по сравнению с poll(). В наши дни оба интерфейса входят в стандарт SUSv3 и широко применяются в современных системах. Тем не менее, как отмечалось в подразделе 59.2.3, поведение вызова poll() может варьироваться в зависимости от реализации.

Производительность

Производительность вызовов poll() и select() одинакова, если выполняется любое из следующих условий:

• диапазон файловых дескрипторов, за которыми нужно наблюдать, достаточно узок (выбран небольшой максимальный номер дескриптора);

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

Однако производительность вызовов select() и poll() может заметно отличаться в ситуации, когда набор отслеживаемых файловых дескрипторов разрежен, то есть если максимальный номер дескриптора, N, является большим, но в диапазоне от 0 до N находится один или несколько элементов. В данном случае poll() может работать быстрее, чем select(). Чтобы понять, почему так происходит, рассмотрим передаваемые этим двум системным вызовам аргументы. Вызов select() принимает один или несколько наборов с файловыми дескрипторами и целое число, nfds, которое на единицу больше, чем максимальный номер отслеживаемых дескрипторов в каждом из наборов. Значение nfds не зависит от того, наблюдаем ли мы за всеми дескрипторами в диапазоне от 0 до (nfds — 1) или только за одним из них, (nfds — 1). В обоих случаях ядро должно проверить элементы nfds в каждом из наборов, чтобы определить, какие именно дескрипторы нужно контролировать. Для сравнения: вызову poll() передаются лишь те дескрипторы, которые нас интересуют, и ядро проверяет только их.

Мы еще вернемся к производительности вызовов select() и poll() в подразделе 59.4.5, где они будут сравниваться с интерфейсом epoll.

59.2.5. Проблемы, присущие вызовам select() и poll()

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

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

• При каждом вызове select() или poll() программа должна передавать ядру структуру данных, описывающую все интересующие нас файловые дескрипторы, а после их проверки ядро должно вернуть обратно измененную версию этой структуры (кроме того, перед каждым вызовом select() нужно инициализировать структуру данных). В случае с poll() размер структуры прямо пропорционален количеству подконтрольных дескрипторов, поэтому, если она достаточно большая, на ее копирование в пространство ядра и обратно может уходить довольно много процессорного времени. Применительно к select() размер структуры данных является фиксированным и равен FD_SETSIZE; он не зависит от того, сколько файловых дескрипторов отслеживаются.

• После вызова select() или poll() программа должна проверить каждый элемент полученной структуры данных, чтобы узнать, какие файловые дескрипторы являются готовыми.

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

Плохое масштабирование вызовов select() и poll() вызвано простым ограничением их программных интерфейсов: обычно для проверки одного и того же набора файловых дескрипторов выполняются циклические вызовы; но ядро не запоминает содержимое данного набора, поэтому его нужно передавать снова и снова.

Ввод/вывод на основе сигналов и интерфейс epoll (будут рассмотрены в следующих разделах) позволяют ядру записывать набор файловых дескрипторов, в которых заинтересован процесс. Это устраняет проблемы с масштабированием, присущие вызовам select() и poll(), и обеспечивает производительность, зависящую не от количества отслеживаемых дескрипторов, а от частоты событий ввода/вывода. Следовательно, ввод/вывод на основе сигналов и интерфейс epoll являются более предпочтительными в ситуациях, когда дескрипторов слишком много.

59.3. Ввод/вывод на основе сигналов

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных