Необходимость взаимного исключения процессов/нитей

Alexander Zheglov tolko.bi.vyzhit at gmail.com
Wed Mar 12 04:00:55 MSK 2008


Добрый день!
Написал и использую модуль для ограничения количества запросов к серверу за
промежуток времени с одного IP. Данные организованы следующим образом: в
разделяемой памяти хранятся связанные списки структур статистики по ip
адресам, нужная строка выбирается простой хеширующей функцией от ip адреса.
Соответсвенно там происходит выделение и освобождение памяти. Для защиты
указателей списка во время поиска по строке я использую pthread_mutex_lock
на строку. Чтобы понятнее было:
..
addr = ((struct sockaddr_in *) (r->connection->sockaddr))->sin_addr.s_addr;
key = rlimit_hash_key(addr, ..);
..
pthread_mutex_lock(&ctx->hash_locks[key]);
..
тут ищем статистику, в общем шаримся по разделяемой памяти
..
ret = check_node(..);
pthread_mutex_unlock(&ctx->hash_locks[key]);
return ret;

Обработчик устанавливается через:
..
h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
..

Собственно вопрос в чем. Я печатаю статистику работы модуля и число
процессов в критическом интервале все время равно нулю, несмотря на довольно
значительную загрузку сервера. У меня складывается ощущение, что я чего-то
не понимаю.
То ли вообще нет необходимости в защите разделяемой памяти в этом месте, то
ли это специфично только для freeBSD. Под Linux, увы, нет достаточно
нагруженного сервера.
Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?
С уважением, Александр
P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx-ru/attachments/20080312/e46d2905/attachment.html>


More information about the nginx-ru mailing list