ПРОЕКТЫ 


  АРХИВ 


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: "AlexyFrost" <nginx-forum@xxxxxxxx>
  • Date: Tue, 25 Feb 2014 18:17:31 -0500
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=selenium.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=hQ1LLJ5xChJr/OqrXP23PnRbqLj2C0KMrNHiou0Bw5w=; b=PNbACZ3hAzBP9+OMz20hc7eJmtC3Yj2IP492R7lGn2Bqdxf7x1X64qRnNHfCWNHhmwGslfDXXDKBTOQn1HDL+4I/fnZZXUjm3EBdTUNSP6HvdiOIpUUJfC5jfhlfbHV0palkrkJOv1lmUZKP3RooBXLAPqu0k6Q68fNkxs2QsDY=;

Привет.

Предлагаю подискутировать о процессной модели nginx. Раскуривал недавно
исходники, хотелось прояснить пару философских моментов, которые мучают меня
уже не первый год, и вот натолкнулся на эти моменты со spawn`ом воркеров.

Как известно, форк "наследует" кучу "мусора" из родительского процесса:
обработчики сигналов, дескрипторы файлов\сокетов, переменные и т.п., словом,
память стека и кучи. Так вот, как же избежать этого: "почистить" от
родительской памяти форкнутый процесс нельзя, а юзать exec*() для запуска
стороннего бинарника-воркера, который бы полностью заместил собой память
форка - это значит делать второй, отдельный бинарник, что не так элегантно,
как решение с одним исполняемым файлом nginx`а + fork().

Основной вопрос в том, что метод с fork() имеет сильную зависимость от
родительского процесса. Например, если сначала добавить какие-нибудь
обработчики сигналов в родителе, а потом форкнуть, nо дочерний процесс их
унаследует, следовательно, форк подвержен значительным сайд-эффектам, и
зависим даже от порядка кода в родительского процесса. Можно, конечно,
условиться о порядке запуска, и о том, что делать "ататат" с копией чужой
памяти нельзя, но это всё как то грустно выглядит, и вообще, нарушает
принцип инкапсуляции.

Короче, хотелось бы услышать мнения о том, как же правильно организовывать
многопроцессное приложение: fork() или fork() + exec() (ну или system()),
преимущества и недостатки тех или иных подходов, и почему в nginx
используется именно fork(), а не что то другое из вышеописанного.

Спасибо.

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,247942,247942#msg-247942

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.