ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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

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

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

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

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

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


 




Copyright © Lexa Software, 1996-2009.