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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 15: Строка 15:
* слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, [[стэк]]);
* слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, [[стэк]]);
* слишком велики накладные расходы на переключение контекстов.
* слишком велики накладные расходы на переключение контекстов.
Филосовской предпосылкой для отказа от потоковой модели серверов может служить высказывание [[Алан Кокс|Алана Кокса]]: "Компьютер –- это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы" <ref>http://www.uwsg.indiana.edu/hypermail/linux/kernel/0106.2/0405.html<ref/>
Филосовской предпосылкой для отказа от потоковой модели серверов может служить высказывание [[Алан Кокс|Алана Кокса]]: "Компьютер –- это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы" <ref>http://www.uwsg.indiana.edu/hypermail/linux/kernel/0106.2/0405.html</ref>


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

Версия от 12:06, 29 апреля 2008

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[2]

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

См. также

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

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

  • Н.Н.Непейвода. Стили и методы программирования. курс лекций. учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.
  • О.В. Ануфриев. О методике обучения основам событийного программирования
  • А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal
  1. http://www.uwsg.indiana.edu/hypermail/linux/kernel/0106.2/0405.html