Событийно-ориентированное программирование: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Alecs.bot (обсуждение | вклад)
м робот добавил: simple:Event-driven programming
Строка 27: Строка 27:
* [[/dev/poll]] ([[Solaris]]);
* [[/dev/poll]] ([[Solaris]]);
* [[IO completion port]] ([[Window]]);
* [[IO completion port]] ([[Window]]);
* [[POSIX AIO]] на текущий момент только для операций дискового ввода-вывода.
* [[POSIX AIO]] на текущий момент только для операций дискового ввода-вывода;
* [[io_submit]] и [[eventfd]] для операций дискового ввода-вывода.


=== Примеры реализаций ===
=== Примеры реализаций ===

Версия от 15:11, 17 ноября 2008

Событийно-ориентированное программирование (англ. event-driven programming) — это способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.

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

Сфера применения

Событийно-ориентированное программирование, как правило, применяется в трех случаях:

  1. при построении пользовательских интерфейсов (в том числе ГПИ);
  2. при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
  3. при программировании игр, в которых осуществляется управление множеством объектов.

Применение в серверных приложениях

Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.

В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:

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

Философской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса: «Компьютер — это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы» [1]

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

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

Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:

  • select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
  • poll и epoll (Linux);
  • kqueue (FreeBSD);
  • /dev/poll (Solaris);
  • IO completion port (Window);
  • POSIX AIO на текущий момент только для операций дискового ввода-вывода;
  • io_submit и eventfd для операций дискового ввода-вывода.

Примеры реализаций

Инструменты и библиотеки

[2]

  • Simple Unix Events a.k.a. SUE, простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++.

См. также

англоязычные источники

материалы на русском

  • Н.Н.Непейвода. Стили и методы программирования. курс лекций. учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.
  • О. В. Ануфриев. О методике обучения основам событийного программирования
  • А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal

Ссылки