Re: бэк-енд для memcached

Daniel Podolsky onokonem at gmail.com
Fri Mar 20 23:29:40 MSK 2009


> Это была шутка. Пока nginx работает, он, разумеется, не может выполнять
> что-то другое, видимо, это и имелось в виду во фразе "блокируется!
> Просто - ненадолго".
Пожалуй, я должен объясниться. Да, это была шутка. Да - не только шутка.

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

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

Как устроено обычное асинхронное, оно же неблокирующее(ся), чтение?
мы выдаем системе запрос системе "дорогая, запиши себе задание -
прочесть нам вот в эту область памяти из этого вот потока, скажем, 1
байт, и как прочтешь - сообщи нам". Система опять отправляется
выполнять, и - заметьте! - вернет нам управление только как сделает,
что велено. Но велено-то на этот раз существенно более простое -
записать задание в очередь. И управление вернется к нам быстро, и мы
сможем что-нибудь полезное поделать, пока система там парится наш байт
читать. Например - придумать системе еще аналогичных заданий, про
другие потоки.
Когда система отрапортует, что данные прочитаны - мы сможем их как-то
обработать. В случае с nginx мы попросим систему записать данные в
другой поток...

теперь рассмотрим ситуацию, когда данные наши не надо ни откуда
реально читать - они уже закешированны в памяти. при грамотной
организации буферов - даже копирования в памяти происходить не будет -
нам просто отдадут указательна ту область памяти, где данные уже
лежат.
Очевидно, синхронное чтение заблокируется, ровно на то время, что
требуется для этой нехитрой операции. И окажется - опять же, очевидно!
- сначительно более быстрым, чем асинхронное.

Асинхронный ввод-вывод - не волшебный способ "сделать быстро", а
техника, позволяющая обработать более одного потока в одном
процессе/треде. Со своими минусами - ну хоть размеры описаний
процессов сравните :)


More information about the nginx-ru mailing list