Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: бэк-енд для memcached
On Fri, Mar 20, 2009 at 11:29:40PM +0300, Daniel Podolsky wrote:
> > Это была шутка. Пока nginx работает, он, разумеется, не может выполнять
> > что-то другое, видимо, это и имелось в виду во фразе "блокируется!
> > Просто - ненадолго".
> Пожалуй, я должен объясниться. Да, это была шутка. Да - не только шутка.
>
> Начнем с того, что любой системный вызов - блокируется. В том смысле,
> что пока он не выполнится - управление в нашу программу не
> возвращается, и делать мы ничего не можем.
>
> Как устроено обычное синхронное, оно же блокирующее(ся), чтение?
> мы выдаем системе запрос системе "ну-ка, прочти нам вот в эту область
> памяти из этого вот потока, скажем, 1 байт". Система отправляется
> выполнять, и, как сделает, что велено - вернет в нашу программу
> управление.
>
> Как устроено обычное асинхронное, оно же неблокирующее(ся), чтение?
> мы выдаем системе запрос системе "дорогая, запиши себе задание -
> прочесть нам вот в эту область памяти из этого вот потока, скажем, 1
> байт, и как прочтешь - сообщи нам". Система опять отправляется
> выполнять, и - заметьте! - вернет нам управление только как сделает,
> что велено. Но велено-то на этот раз существенно более простое -
> записать задание в очередь. И управление вернется к нам быстро, и мы
> сможем что-нибудь полезное поделать, пока система там парится наш байт
> читать. Например - придумать системе еще аналогичных заданий, про
> другие потоки.
> Когда система отрапортует, что данные прочитаны - мы сможем их как-то
> обработать. В случае с nginx мы попросим систему записать данные в
> другой поток...
>
> теперь рассмотрим ситуацию, когда данные наши не надо ни откуда
> реально читать - они уже закешированны в памяти. при грамотной
> организации буферов - даже копирования в памяти происходить не будет -
> нам просто отдадут указательна ту область памяти, где данные уже
> лежат.
> Очевидно, синхронное чтение заблокируется, ровно на то время, что
> требуется для этой нехитрой операции. И окажется - опять же, очевидно!
> - сначительно более быстрым, чем асинхронное.
>
> Асинхронный ввод-вывод - не волшебный способ "сделать быстро", а
> техника, позволяющая обработать более одного потока в одном
> процессе/треде. Со своими минусами - ну хоть размеры описаний
> процессов сравните :)
Нет, здесь смешаны асинхронный i/o (aio_read/aio_write/etc) и
обычный неблокирующийся i/o (read/write), а это разные вещи.
Если данные готовы, то неблокирующийся read работает так же,
как и блокирующийся. Там, собственно, один и тот же code path.
А вот aio - да, сначала задание, потом нотификация о завершении
операции, а потом собственно получение данных.
--
Игорь Сысоев
http://sysoev.ru
|