Ответ 1
Недостатки потоков
Темы:
- Сериализовать операции с памятью. Это ядро, и в свою очередь MMU должен обслуживать такие операции, как
mmap()
, которые выполняют распределение страниц. - Поделитесь той же файловой дескрипторной таблицей. Блокировка включает в себя внесение изменений и выполнение поиска в этой таблице, в которой хранятся такие вещи, как смещения файлов и другие флаги. Каждый системный вызов, который использует эту таблицу, например
open()
,accept()
,fcntl()
, должен блокировать ее для переводаfd
во внутренний дескриптор файла и при внесении изменений. - Поделитесь некоторыми атрибутами планирования. Процессы постоянно оцениваются для определения нагрузки, которую они загружают в систему, и соответственно планируются. Множество потоков подразумевает более высокую нагрузку на процессор, что обычно не нравится планировщику, и увеличивает время отклика на события для этого процесса (например, считывание входящих данных в сокете).
- Может передавать некоторые записываемые данные. Любая память, написанная несколькими потоками (особенно медленная, если она требует фантазии блокировки), будет генерировать все виды конфликтов и конфликтов конфликтов. Например, операции кучи, такие как
malloc()
иfree()
, работают с глобальной структурой данных (что в какой-то степени можно обойти). Существуют и другие глобальные структуры. - Поделите учетные данные, это может быть проблемой для процессов типа обслуживания.
- Обработка сигналов общего доступа, они будут прерывать весь процесс во время обработки.
Процессы или потоки?
- Если вы хотите облегчить отладку, используйте потоки.
- Если вы используете Windows, используйте потоки. (Процессы чрезвычайно тяжелы в Windows).
- Если стабильность является серьезной проблемой, попробуйте использовать процессы. (Один
SIGSEGV/PIPE
- это все, что требуется...). - Если потоки недоступны, используйте процессы. (Не так часто, но это произошло).
- Если ваши потоки совместно используют ресурсы, которые нельзя использовать из нескольких процессов, используйте потоки. (Или предоставить механизм IPC, позволяющий связываться с потоком "владельца" ресурса).
- Если вы используете ресурсы, доступные только по принципу "один за процессом" (и каждый из них для каждого контекста), очевидно, используйте процессы.
- Если ваши контексты обработки не имеют абсолютно ничего (например, сервер сокетов, который порождает и забывает подключения, как он
accept()
их), а ЦП является узким местом, используют процессы и однопоточные промежутки времени (которые лишены всех видов интенсивная блокировка, например, на куче и в других местах). - Одно из самых больших различий между потоками и процессами: Threads использует программные конструкции для защиты структур данных, процессы используют аппаратное обеспечение (что значительно быстрее).