Приложения Linux, как правило, разветвляются затем на exec (с execve ()), но приложения Java и некоторые MPM Apache используют многопоточность. Если разветвляется, использует fork + exec для запуска процесса, какова высокоуровневая версия для многопоточности? Как JVM или Worker MPM порождают потоки?
9
Ответы:
Идея потоков и процессов примерно одинакова: вы разветвляете путь выполнения. В противном случае потоки и процессы различаются в таких вещах, как память. Т.е. процессы имеют разное виртуальное пространство, а потоки разделяют все, что существовало до разделения.
В основе работы потоков и разветвления лежит вызов clone () (клон man 2):
Различия происходят от флагов, которые передаются в clone (). Как вы можете видеть из справочной страницы, fork и threading - это просто набор предопределенных параметров для clone (). Тем не менее, можно также сделать пользовательские вещи с ним.
источник
Большинство не-Unix многопроцессорных операционных систем (ОС) используют вызов spawn () или что-то подобное для генерации нового процесса ОС или потока управления. Spawn () имеет тенденцию быть очень сложным вызовом, с большим количеством опций и большим количеством накладных расходов. Одним из нововведений Unix было предоставление гораздо меньших накладных расходов для создания процессов - fork (). Unix позаботился о многих необходимых опциях spawn (), разрешив произвольное количество обработки перед другой половиной spawn (), с помощью exec ().
Поскольку Unix и его варианты использовались все больше и больше, было признано, что создание процесса с низкими накладными расходами было полезным и использовалось. На самом деле, он использовался настолько сильно, что люди хотели еще меньше накладных расходов для создания процессов, и поэтому родилась идея «потоков». Первоначально потоки полностью обрабатывались исходным процессом (и программы, подобные JVM, могут делать это с «зелеными потоками»); но обработка многопоточного планирования является сложной задачей и часто выполнялась неправильно. Таким образом, существует более простой, промежуточный способ выполнения потоков, когда ОС обрабатывает планирование, но некоторые накладные расходы сохраняются (обычно) путем совместного использования адресного пространства между потоками.
На ваш вопрос сложно ответить, потому что есть несколько разных, но связанных понятий, которые являются «нитями», и для подробностей вам нужно прилагательное, чтобы описать, на какую из них вы ссылаетесь. С другой стороны, понимание различий, вероятно, приведет вас к конкретному ответу, который вы хотите. Посмотрите на такие вещи, как «облегченные процессы», «пользовательские потоки» и «rfork ()» для получения дополнительной информации.
источник
CreateProcess()
ничего похожегоfork()
.fork()
.Потоки и разветвления - это на самом деле две разные концепции, обе из которых существуют в системах Unix / Linux (и обе могут использоваться в C / C ++).
Идея fork () - это (очень по сути) создание отдельного процесса, который имеет тот же код выполнения, что и родительский процесс, и который начинает выполнение на линии ветвления. Цель использования вилок с функциями exec состоит в том, что функции exec закрывают процесс, который вызвал их, когда они заканчиваются. Таким образом, вы обычно выполняете форк, получая PID каждого процесса (child всегда равен 0), и заставляете родителя ждать, пока дочерний процесс завершит выполнение функции exec.
Потоки используются для параллелизма (напомним, что родитель ожидает ребенка, как правило, в разветвленной программе). Поток, такой как pthread в C / C ++ (поиск Google), будет работать параллельно основному процессу и может совместно использовать глобальные переменные и глобальные функции с исходной программой. Поскольку потоки Java ведут себя одинаково, я бы предположил, что они действуют больше как эти потоки, а не как процесс разветвления.
По сути, есть различие между разветвлением и нарезкой. Они делают совершенно разные вещи (хотя кажутся похожими). Эти понятия могут быть трудны для понимания, но вы можете изучить их с помощью (обширных) исследований, если у вас есть искреннее желание понять их.
РЕДАКТИРОВАТЬ # 1
Пожалуйста, посмотрите эти примеры того, как вилки и нити могут быть вызваны и использованы. Обратите внимание на поведение функций exec и их влияние на основную программу.
http://www.jdembrun.com:4352/computerScience/forkVSthread.zip
источник
pthread
является API, а не реализация потока.И JVM, и Apache MPM полагаются на ядро для собственных потоков. То есть они используют ОС для планирования их. Конечно, обоим нужен собственный API для отслеживания вещей.
Stackoverflow уже имеет несколько вопросов, касающихся этого:
Собственные темы JVM , проверьте этот ответ для более подробной информации.
Apache имеет два типа MPM: Prefork, с одним процессом на поток, и Worker, который обрабатывает несколько потоков: Apache MPM . Проверьте ссылку на
codebucket
источник
Это зависит от платформы, но в linux, и я бы предположил, что многие другие POSIX-совместимые системы используют локальную реализацию pthreads , API потоков пользователя. Например:
Запускает новый поток, вызывающий
somefunc
его в качестве первой точки выполнения.Вы также можете создавать потоки, отличные от вилок тем, что они совместно используют одно и то же пространство глобальной динамической памяти родительского процесса, вместо того, чтобы получать его копию (но обратите внимание, что каждый из потоков выполняется с собственной независимой стековой памятью) - с
clone()
системным вызовом, который построен на основе pthreads.источник