Потоки против процессов в Linux - PullRequest
230 голосов
/ 30 апреля 2009

Недавно я слышал, как несколько человек говорят, что в Linux почти всегда лучше использовать процессы, а не потоки, поскольку Linux очень эффективен в обработке процессов и потому, что существует так много проблем (таких как блокировка), связанных с ними. с темами. Тем не менее, я подозрительно, потому что кажется, что потоки могут дать довольно большой прирост производительности в некоторых ситуациях.

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

Ответы [ 14 ]

2 голосов
/ 18 июня 2010

В большинстве случаев я бы предпочел процессы над потоками. Потоки могут быть полезны, когда у вас относительно небольшая задача (издержки процесса >> время, затрачиваемое каждым разделенным блоком задач), и между ними требуется разделение памяти. Подумайте, большой массив. Также (оффтоп), обратите внимание, что если загрузка вашего процессора составляет 100 процентов или близка к ней, многопоточность или обработка не принесут никакой пользы. (на самом деле это ухудшится)

1 голос
/ 29 апреля 2019

Я думаю, что все проделали большую работу, отвечая на ваш вопрос. Я просто добавляю больше информации о потоке против процесса в Linux, чтобы прояснить и обобщить некоторые предыдущие ответы в контексте ядра. Итак, мой ответ касается специфичного для ядра кода в Linux. Согласно документации ядра Linux, нет четкого различия между потоком и процессом, за исключением того, что поток использует общее виртуальное адресное пространство в отличие от процесса. Также обратите внимание, что ядро ​​Linux использует термин «задача» для обозначения процесса и потока в целом.

"Нет внутренних структур, реализующих процессы или потоки, вместо этого есть структура task_struct, которая описывает абстрактный модуль планирования, называемый задачей"

Также, согласно Линусу Торвальдсу, вы НЕ должны вообще думать о процессе по сравнению с потоком, потому что он слишком ограничивает, и единственное отличие - это COE или контекст выполнения с точки зрения «отделения адресного пространства от родительского» или общего адресного пространства , На самом деле он использует пример веб-сервера, чтобы выразить свою точку зрения здесь (что настоятельно рекомендуется к прочтению).

Полная информация о документации ядра Linux

1 голос
/ 26 октября 2018

Потоки -> Потоки разделяют пространство памяти, это абстракция ЦП, она легкая. Процессы -> Процессы имеют собственное пространство памяти, это абстракция компьютера. Чтобы распараллелить задачу, вам нужно абстрагировать процессор. Однако преимуществом использования процесса над потоком является безопасность, стабильность, в то время как поток использует меньше памяти, чем процесс, и обеспечивает меньшую задержку. Примером с точки зрения сети будет Chrome и Firefox. В случае Chrome каждая вкладка - это новый процесс, поэтому использование памяти в chrome выше, чем в Firefox, а обеспеченная безопасность и стабильность лучше, чем в Firefox. Безопасность, обеспечиваемая Chrome, лучше, так как каждая вкладка - это новый процесс, который не может быть отслежен в пространстве памяти данного процесса.

0 голосов
/ 30 апреля 2009

Если вам нужно поделиться ресурсами, вам действительно следует использовать потоки.

Также учтите тот факт, что переключение контекста между потоками намного дешевле, чем переключение контекста между процессами.

Я не вижу причин для явного перехода к отдельным процессам, если у вас нет веских причин для этого (безопасность, проверенные тесты производительности и т. Д ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...