ПРОЕКТЫ 


  АРХИВ 


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]

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


  • To: nginx-ru@xxxxxxxxx
  • Subject: Необходимость взаимного исключения процессов/нитей
  • From: "Alexander Zheglov" <tolko.bi.vyzhit@xxxxxxxxx>
  • Date: Wed, 12 Mar 2008 04:00:55 +0300
  • Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=dBaoSv+pXJcoNQQ447ttTw5gJn0gK9qdHPDH3KFAs2E=; b=pUqizWPQph7YZchbJ5Mmp8iQ3XrQrYyr9S5XzU0NJmqGbUFucfaEpmuH+DIjOy/tU8D4eEgL4RDswAb7TlvOp0LMZ+64GkUO5l6a3hLFWXgrAZqF+vdTLg9EAfTV3ik6a3uQtmREN5U8CO2anEGeky/+dQtNTmPmLZn1iXWE154=
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=bmyANKtK0mZ389X4jUvpkuRwz210u69eJysSt+iXzfdhLXrX4cH3ROANgT07YdUs9BVoQQD4pWAZOnCOaARyo/JtBroj5IiB2C1EMDYiZiCV4tJf19Gay8TXx8KTtmhdzoDVnK12OfDDnqVDqGd4jSQElUp/yKpTLrQi5xkE5sM=

Добрый день!
Написал и использую модуль для ограничения количества запросов к серверу за промежуток времени с одного 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. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?


 




Copyright © Lexa Software, 1996-2009.