Для некоторых программ, которые выигрывают от параллелизма, решение о том, использовать ли процессы или потоки может быть затруднено. Вот несколько рекомендаций, которые помогут вам решить, какая модель параллелизма лучше всего подходит вашей программе:
1> Все темы в программе должны выполняться одинаково. С другой стороны, дочерний процесс может запускать другой исполняемый файл, вызывая функцию exec.
2> Исправляемый поток может нанести вред другим потокам в том же процессе, потому что потоки разделяют одно и то же пространство виртуальной памяти и другие ресурсы. Например, запись дикой памяти через неинициализированный указатель в одном потоке может привести к повреждению памяти, видимой для другого потока.
3> С другой стороны, ошибочный процесс не может сделать этого, потому что каждый процесс имеет копию пространства памяти программы.
4> Копирование памяти для нового процесса добавляет дополнительные служебные накладные расходы по сравнению с созданием нового потока. Однако копия выполняется только при изменении памяти, поэтому штраф минимален, если дочерний процесс считывает только память.
5> Нити должны использоваться для программ, требующих мелкозернистого параллелизма. Например, если проблему можно разбить на несколько, почти идентичных задач, потоки могут быть хорошим выбором. Процессы должны использоваться для программ, требующих более грубого параллелизма.
6> Обмен данными между потоками является тривиальным, поскольку потоки разделяют одну и ту же память. (Тем не менее, следует проявлять большую осторожность, чтобы избежать условий гонки, как описано ранее.) Для обмена данными между процессами требуется использование механизмов МПК. Это может быть более громоздким, но делает несколько процессов менее подверженными ошибкам параллелизма.
Есть ли разница с Linux 2.4? – mouviciel
Разница между процессами и потоками в Linux 2.4 заключается в том, что потоки разделяют больше частей своего состояния (адресное пространство, дескрипторы файлов и т. Д.), Чем процессы, которых обычно нет. NPTL под Linux 2.6 делает это немного яснее, предоставляя им «группы потоков», которые немного похожи на «процессы» в win32 и Solaris. – MarkR
Да, NPTL хорош: он делает такие вещи, как kill, exec и т. Д., Работает так, как вы ожидали бы в многопоточной программе (старое поведение LinuxThreads имеет смысл с учетом реализации, но было неприятным).OTOH «группа потоков» - это всего лишь коллекция «потоков», и на самом деле она не занимает самих ресурсов, поэтому она весит тонну, чем процесс NT или Solaris. – ephemient