Асинхронный ввод-вывод: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
мНет описания правки
→‎Select(/poll) цикл: заменены некотрые слова, улучшена смысловая передача, исправлены ошибки перевода
Строка 30:
 
=== Select(/poll) цикл ===
Доступен в [[BSD]] [[Unix]], и почти всюдув любой системе, где есть [[TCP/IP]] стек протоколов, чтокоторый либо использует илилибо моделирует реализацию BSD. Вариация на тему опрашивания, select цикл использует системный вызов <code>[[:en:Select (Unix)|select]]</code> системныйкоторый вызовспит ([[:en:Sleep (operating system)|sleep]]), пока состояние не возникнет определенное состояние на [[Файловый дескриптор|дескрипторе файла]] (например, когда данные доступны для чтения), наступает [[Тайм-аут (телекоммуникации)|тайм-аут]], или приходит [[Сигналы (UNIX)|сигнал]] (например, когда дочерний процесс завершается). На основе анализа параметров возврата вызова <code>select</code>, цикл выясняет какие файловые дескрипторы изменились и выполняет соответствующий код. Часто, для удобства использования, цикл select реализуют в виде [[цикл событий|цикла обработки событий]], возможно, с использованием [[Callback (программирование)|функции обратного вызова]]; ситуация подходит особенно хорошо для [[Событийно-ориентированное программирование|событийного программирования]].
 
Хотя этот метод и является надежным и относительно эффективным, он в значительной степени зависит от [[Unix]] парадигмы, «[[всё это файл]]»; Любая блокировка ввода/вывода, которая не связана с дескриптором файла будет блокировать этот процесс. Цикл Select также зависит от способности привлечьсвести весь ввод/вывод в центральной вызов <code>select</code>; библиотеки, которые предоставляют свой собственный ввод-вывод особенно проблематичны в этом отношении. Дополнительная потенциальная проблема заключается в том, что select и операции ввода/вывода по-прежнему не достаточно развязанысвязаны, при этом результат select фактически может быть эффективно не истиннымложным: если два процесса читают из одного дескриптора файла (возможноскорее всего, плохой дизайн) select может указывать на наличие данных для чтения, которые исчезнут к тому времени, когда будет производится чтение, что приводит к блокированию; если два процесса производят запись на одном дескрипторе файла (не такая уж редкость) select может указывать на немедленную готовность к записи, однаков то время как запись может быть всё-же блокироватьблокирована, потому что буфер был заполнен другим процессом в промежутке времени, или из-за слишком большого размера записи для доступного буфера, или другими способами, неподходящим кдля получателюполучателя.
 
Цикл select не достигнет эффективности новейших систем, возможно из-за, скажем, метода ''очередиочередей завершение'', потому что семантика вызова <code>select</code>, позволяет, как это делается, по-вызовно настраивать подходящий набор событий, расходует некоторое количество времени на вызов, пересекающийкоторый обходит выбранный массив. Это создает небольшие накладные расходы для пользовательских приложений, которыеу могуткоторых иметьможет дескрипторбыть открытогооткрыт файлаодин файловый дескриптор для оконной системы и ещё несколько для открытых файлов, но становитсяпереростает в более серьезнаясерьезную проблемапроблему, поскольку число потенциальных источников событий растет, и может препятствовать развитию многих-клиент серверных приложений; другие асинхронные методы могут быть заметно более эффективными в таких случаях. Некоторые Unix-системы обеспечивают специфические для данной системы вызовы с лучшей масштабируемостью; например, <code>[[Epoll]] </code> в [[Linux]] (который заполняет выбранный массив возврата только с теми источниками событий, на которых события произошли события), <code>[[kqueue]]</code> в [[FreeBSD]], и <code>/dev/poll</code> в [[Solaris (операционная система)|Solaris]].
 
[[UNIX System V|SVR3]] [[Unix]] предоставляет системный вызов <code>poll</code>. Возможно лучше назван, чем <code>select</code>, для целей этого обсуждения, но по сути, одно и то же. SVR4 системы Unix (и, таким образом, [[POSIX]]) предоставляют и тот и другой вызовы.