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

В табл. 59.1 собраны модели уведомлений, которые используются при мультиплексировании ввода/вывода, в вводе/выводе на основе сигналов и в интерфейсе epoll. Последний отличается от первых двух возможностью применения обеих моделей: по уровню и по фронту.


Таблица 59.1. Использование уведомлений, срабатывающих по уровню и по фронту

Модель ввода/вывода

По уровню?

По фронту?

select() и poll()

*


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


*

Интерфейс epoll

*

*


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

Используя уведомления, срабатывающие по фронту, можно проверять готовность файлового дескриптора в любое время. То есть, когда файловый дескриптор готов (например, при появлении в нем входящих данных), можно выполнить для него операцию ввода/вывода и затем повторно проверить, готов ли он для дальнейшего применения (например, остались ли в нем данные для чтения); в случае положительного ответа можно продолжить выполнение ввода/вывода. Иными словами, благодаря возможности постоянного наблюдения в любой момент времени можно не загружать приложение по максимуму (например, считывая как можно больше данных) при каждом уведомлении о готовности файлового дескриптора (на самом деле можно вообще не выполнять никакого ввода/вывода).

Для сравнения: если выбрать модель срабатывания по фронту, то уведомления будут приходить только в ответ на события ввода/вывода. Кроме того, при возникновении такого события обычно не известно, сколько именно данных можно прочитать или записать. Следовательно, программы, которые используют эту модель, как правило, проектируются в соответствии со следующими правилами.

• Получив уведомление о событии ввода/вывода, программа в какой-то момент должна прочитать или записать в заданный дескриптор как можно больше данных. Если ей не удастся это сделать, то она может потерять возможность выполнить определенный ввод/вывод, поскольку до получения следующего события не будет знать о необходимости дополнительных действий с файловым дескриптором. Так может возникнуть ложная потеря данных или блокировка программы. Словосочетание «в какой-то момент» выбрано неслучайно, так как в некоторых случаях ввод/вывод не стоит выполнять сразу же после получения уведомления о готовности дескриптора. Дело в том, что при чтении или записи большого объема данных можно оставить другие файловые дескрипторы без работы. Мы рассмотрим этот случай более подробно в подразделе 59.4.6, когда будем обсуждать применение модели уведомлений, срабатывающих по фронту, для интерфейса epoll.

• Если программа использует цикл, чтобы прочитать или записать как можно больше данных, а дескриптор помечен как блокирующий, то системный вызов ввода/вывода рано или поздно заблокируется, когда передача данных станет невозможной. В связи с этим каждый отслеживаемый файловый дескриптор обычно переводится в неблокирующий режим, а после события ввода/вывода операции чтения или записи продолжают выполняться до тех пор, пока соответствующий системный вызов (например, read() или write()) не завершится ошибкой EAGAIN или EWOULDBLOCK.


59.1.2. Применение неблокирующего режима в сочетании с альтернативными моделями ввода/вывода

Неблокирующий режим (флаг O_NONBLOCK) часто используется в сочетании с альтернативными моделями ввода/вывода, описанными в данной главе. Ниже приводятся некоторые примеры того, почему это может быть полезным.

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

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

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

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

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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

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