The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Разбор стратегий организации ввода/вывода

14.02.2004 21:04

В статье "Understanding Network I/O" (часть 1, часть 2) приводятся примеры создания сетевых программ на языке Python, включая использования мультитредовой модели и опроса состояний через select/ poll.

Материал подтолкнул меня обобщить используемые модели ввода/вывода:

Стратегии организации ввода-вывода:

  1. Блокируемый I/O - после вызова read/write происходит блокировка до завершения операции, функция завершается только после принятия или передачи блока данных.
  2. Неблокируемый I/0 - функция завершается сразу, если данные не были приняты/отправлены возвращается код ошибки (т.е. нужно вызывать функции I/O в цикле пока не получим положительный результат).
  3. Мультиплексирование через select/poll - опрашиваем список состояния сокетов, перебирая состояния определяем сокеты готовые для приема/передачи. Главный минус - затраты на перебор, особенно при большом числе неактивных сокетов.
    • select - число контролируемых сокетов ограничено лимитом FD_SETSIZE, в некоторых случаях лимит обходится пересборкой программы, в других - пересборкой ядра ОС.
    • poll - нет лимита FD_SETSIZE, но менее эффективен из за большего размера передаваемой в ядро структуры.
  4. Генерация сигнала SIGIO при изменении состояния сокета (ошибка, есть данные для приема, или отправка завершена), который обрабатывает обработчик SIGIO. В классическом виде применение ограничено и трудоемко, подходит больше для UDP.
  5. Асинхронный I/O - описан в POSIX 1003.1b (aio_open, aio_write, aio_read...), функция aio_* завершается мгновенно, далее процесс сигнализируется о полном завершении операции ввода/вывода (в предыдущих пунктах процесс информировался о готовности прочитать или передать данные, т.е. данные еще нужно было принять или отправить через read/write, в aio_* процесс сигнализируется когда данные полностью получены и скопированы в локальный буфер).
  6. Передача данных об изменении состояния сокета через генерацию событий. (специфичные для определенных ОС решения, малопереносимы, но эффективны).


  1. Главная ссылка к новости (http://www.onlamp.com/pub/a/py...)
  2. The C10K problem - отличное собрание информации по стратегиям ввода/вывода
  3. ru.unix.prog FAQ - Некоторые методы получения состояния (активности) сокета
  4. High-Performance Server Architecture
  5. Сравнение производительности poll, kqueue и /dev/poll
  6. Сравнение производительности poll() и realtime signals
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/3408-proccess
Ключевые слова: proccess, realtime, speed, queue, socket, threads, solaris, kernel, select, linux, freebsd, blocking, signal
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (1) RSS
  • 1, Exe (?), 23:44, 21/01/2007 [ответить]  
  • +/
    /dev/epoll нету, есть просто epoll :)
     
     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру