Архив метки: процесс

Потоки и процессы

Процесс — адресное пространство с кодом программы, данными, какие-то внешние ресурсы. Грубо говоря, это объединение общих ресурсов. В рамках процесса выполняется поток — это исполняемый код, который держит свое состояние и данные в стэке и регистрах.

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

Чем же в приближении отличается Apache от nginx? Прежде всего тем, что Apache по сути под каждое соединение держит отдельный большой процесс, который работаю от момент открытия соединения с клиентом, до момента отдачи ему данных и закрытия. В приближении в режиме prefork под каждый новый запрос создается отдельный процесс. В режиме worker задается определенное кол-во процессов, в каждом несколько потоков, которые уже обрабатывают соединения. Похожая схема в nginx, только в apache при этом еще куча различные обвешенных модулей, поэтому это все равно громостко.

В nginx же все проще (хотя apache в режиме worker очень похож на логику работы nginx): задается какое-то кол-во процессов (чаще всего равно кол-ву процессорных ядер в систем), и для каждого задается какое-то кол-во потоков (стоить учесть максимальное кол-во возможных открытых файловых дескрипторов). Каждое соединение отправляется на отдельный поток. Задача nginx — это получить запрос от клиента и отдать ему на это результат работы бэкенда (apache в нашем случае). Отдавать и получать он может долго, но на это тратится минимум ресурсов. Именно на такую быструю и легкую работу он нацелен, прекрасно справляется с «медленными клиентами», существенно разгружая тяжеловесную часть apache, которая занимается генерацией всей информации.

Даже на связке apache-nginx можно убедиться, что потоки предназначены для быстрых действий в рамках уже какой-то заранее определенной среды. В том время как процессы — это и есть та среда, на инициализацию и уничтожение которой тратится немало ресурсов.

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