В чем разница между процессом и потоком? - PullRequest
1429 голосов
/ 14 октября 2008

В чем техническая разница между процессом и потоком?

У меня такое ощущение, что слово «процесс» используется слишком часто, и есть также аппаратные и программные потоки. Как насчет легких процессов в таких языках, как Erlang ? Есть ли определенная причина использовать один термин над другим?

Ответы [ 33 ]

12 голосов
/ 10 мая 2015

И процессы, и потоки являются независимыми последовательностями выполнения. Типичное различие заключается в том, что потоки (одного и того же процесса) работают в общем пространстве памяти, а процессы - в отдельных пространствах памяти.

Процесс

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

Тема

Поток - это базовая единица загрузки процессора; он содержит идентификатор потока, счетчик программ, набор регистров и стек. он разделил с другими потоками, принадлежащими к тому же процессу, свой раздел кода, раздел данных и другие ресурсы операционной системы, такие как открытые файлы и сигналы.

- взято из операционной системы от Galvin

12 голосов
/ 14 октября 2008

Как потоки, так и процессы являются атомарными единицами распределения ресурсов ОС (т. Е. Существует модель параллелизма, описывающая, как процессорное время распределяется между ними, и модель владения другими ресурсами ОС). Есть разница в:

  • Общие ресурсы (потоки по определению совместно используют память, им ничего не принадлежит, кроме стека и локальных переменных; процессы также могут совместно использовать память, но для этого существует отдельный механизм, поддерживаемый ОС)
  • Пространство выделения (пространство ядра для процессов и пространство пользователя для потоков)

Грег Хьюгилл (Greg Hewgill) был прав насчет значения слова «процесс» в Эрланге, а здесь обсуждается, почему Эрланг может делать процессы более легкими.

10 голосов
/ 03 апреля 2013

Попытка ответить на этот вопрос, касающийся мира Java.

Процесс - это выполнение программы, но поток - это отдельная последовательность выполнения внутри процесса. Процесс может содержать несколько потоков. Поток иногда называют облегченным процессом .

Например:

Пример 1: JVM выполняется в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Вот почему несколько потоков могут обращаться к одному и тому же объекту. Потоки разделяют кучу и имеют свое собственное пространство стека. Таким образом, вызов одного потока метода и его локальных переменных защищен потоком от других потоков. Но куча не является поточно-ориентированной и должна быть синхронизирована для обеспечения безопасности потока.

Пример 2: Программа может быть не в состоянии рисовать картинки, читая нажатия клавиш. Программа должна уделять все внимание вводу с клавиатуры, а отсутствие возможности обрабатывать более одного события одновременно может привести к проблемам. Идеальным решением этой проблемы является плавное выполнение двух или более разделов программы одновременно. Темы позволяют нам сделать это. Здесь Рисование изображения - это процесс, а чтение нажатия клавиши - это подпроцесс (нить).

9 голосов
/ 21 ноября 2013

Разница между потоком и процессом?

Процесс - это исполняемый экземпляр приложения, а поток - это путь выполнения внутри процесса. Кроме того, процесс может содержать несколько потоков. Важно отметить, что поток может делать все, что может делать процесс. Но поскольку процесс может состоять из нескольких потоков, поток можно считать «легковесным» процессом. Таким образом, существенным отличием потока от процесса является работа, которую каждый выполняет для выполнения. Потоки используются для небольших задач, тогда как процессы используются для более «тяжелых» задач - в основном для выполнения приложений.

Другое различие между потоком и процессом заключается в том, что потоки в одном и том же процессе совместно используют одно и то же адресное пространство, тогда как разные процессы этого не делают. Это позволяет потокам считывать и записывать одни и те же структуры данных и переменные, а также облегчает связь между потоками. Связь между процессами, также известная как IPC, или межпроцессное взаимодействие, является довольно сложной и ресурсоемкой.

Вот краткое изложение различий между потоками и процессами:

  1. Потоки легче создавать, чем процессы, так как они не требует отдельного адресного пространства.

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

  3. Нити считаются легкими, потому что они используют далеко меньше ресурсов, чем процессов.

  4. Процессы не зависят друг от друга. Темы, так как они Разделить одно и то же адресное пространство взаимозависимо, поэтому нужно брать так, чтобы разные нити не наступали друг на друга.
    Это действительно еще один способ заявить # 2 выше.

  5. Процесс может состоять из нескольких потоков.

8 голосов
/ 17 апреля 2018

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

Линус Торвальдс (torvalds@cs.helsinki.fi)

Вт, 6 августа 1996 г., 12:47:31 +0300 (EET DST)

Сообщения отсортированы по: [дате] [теме] [теме] [автору]

Следующее сообщение: Бернд П. Циллер: «Re: Упс в get_hash_table»

Предыдущее сообщение: Линус Торвальдс: «Re: I / O request ordering»

В понедельник, 5 августа 1996 года, Питер П. Эйзерлох написал:

Нам необходимо четко понимать концепцию потоков. Слишком много людей кажется, перепутать поток с процессом. Следующее обсуждение не отражает текущее состояние Linux, а скорее попытка остаться на высоком уровне обсуждения.

НЕТ!

Нет причин полагать, что "потоки" и "процессы" отдельные лица. Вот как это традиционно делается, но я лично я думаю, что это большая ошибка, думать так. Единственный причина думать, что это исторический багаж.

И потоки, и процессы - это всего лишь одно: «контекст выполнение ». Попытка искусственно различать разные случаи просто самоограничения.

«Контекст исполнения», называемый здесь COE, является просто конгломератом всего состояния этого СЕ Это состояние включает в себя такие вещи, как процессор состояние (регистры и т. д.), состояние MMU (отображения страниц), состояние разрешений (uid, gid) и различные «состояния связи» (открытые файлы, сигнал обработчики и т. д.). Традиционно разница между «нитью» и «Процесс» состоял главным образом в том, что потоки имеют состояние процессора (+ возможно некоторое другое минимальное состояние), в то время как весь другой контекст происходит от процесс. Тем не менее, это просто один способ разделения общего состояния СЕ, и нет ничего, что говорит о том, что это правильный способ сделать это. Ограничивать себя к такому образу просто глупо.

Linux думает об этом (и я хочу, чтобы все работало) что не является такой вещью, как «процесс» или «нить». Есть только совокупность COE (называемая Linux «задачей»). Разные СЕ могут обмениваться частями своего контекста друг с другом и одним подмножеством из что совместное использование является традиционной настройкой "потока" / "процесса", но это действительно следует рассматривать только как подмножество (это важное подмножество, но эта важность проистекает не из дизайна, а из стандартов: мы, безусловно, хочу запускать соответствующие потоки программы поверх Linux тоже).

Короче говоря: НЕ проектируйте с точки зрения потока / процесса мышления. Ядро должно быть спроектировано на основе образа мышления Совета Европы, а затем pthreads library может экспортировать ограниченный интерфейс pthreads для пользователей кто хочет использовать этот взгляд на ИОВ.

Просто как пример того, что становится возможным, когда вы думаете, что СЕ в отличие от потока / процесса:

  • Вы можете создать внешнюю программу "cd", что традиционно невозможно в UNIX и / или process / thread (глупый пример, но идея является то, что вы можете иметь такие "модули", которые не ограничены традиционная настройка UNIX / threads). Сделайте:

Клон (CLONE_VM | CLONE_FS);

child: execve ("external-cd");

/ * «execve ()» будет разъединять ВМ, поэтому единственная причина, по которой мы использованный CLONE_VM должен был ускорить процесс клонирования * /

  • Вы можете сделать «vfork ()» естественным образом (это требует минимальной поддержки ядра, но эта поддержка идеально подходит для мышления CUA):

клон (CLONE_VM); * * тысяча пятьдесят семь

child: продолжать бежать, в конце концов execve ()

мама: жди execve

  • Вы можете делать внешние "IO deamons":

клон (CLONE_FILES);

child: открыть дескрипторы файлов и т. Д.

мама: используйте фд, который ребенок открыл и вв.

Все вышеперечисленное работает, потому что вы не привязаны к потоку / процессу способ мышления. Подумайте о веб-сервере, например, где CGI Сценарии выполняются как «потоки исполнения». Вы не можете сделать это с традиционные темы, потому что традиционные темы всегда должны делиться все адресное пространство, так что вам придется ссылаться на все, что вы когда-либо хотел сделать на самом веб-сервере («поток» не может запустить другой исполняемый файл).

Думая об этом как о проблеме "контекста исполнения", ваш задачи теперь можно выбрать для выполнения внешних программ (= отделить адресное пространство от родителя) и т.д., если они хотят, или они могут для пример поделитесь всем с родителем за исключением для файла дескрипторы (так что под-"потоки" могут открывать много файлов без родитель должен беспокоиться о них: они закрываются автоматически, когда под-поток завершается, и он не использует fd в родительском).

Подумайте, например, о inetd с резьбой. Вы хотите низкие накладные расходы fork + exec, поэтому с Linux вы можете вместо использования fork () вы пишете многопоточный inetd, где каждый поток создается с просто CLONE_VM (разделяйте адресное пространство, но не делитесь дескрипторами файлов так далее). Тогда ребенок может выполнить, если это был внешний сервис (rlogind, например) или может это был один из внутренних сервисов inetd (эхо, timeofday), в этом случае он просто делает свое дело и выходит.

Вы не можете сделать это с помощью "thread" / "process".

Linus

7 голосов
/ 21 февраля 2013

Вот то, что я получил из одной из статей The Code Project Я думаю, это объясняет все, что нужно ясно.

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

7 голосов
/ 13 февраля 2015

С точки зрения интервьюера, есть в основном всего 3 основные вещи, которые я хочу услышать, кроме таких очевидных вещей, как процесс может иметь несколько потоков:

  1. Потоки разделяют одно и то же пространство памяти, что означает, что поток может получить доступ к памяти из памяти другого потока. Процессы нормально не могут.
  2. Ресурсы. Ресурсы (память, дескрипторы, сокеты и т. Д.) Освобождаются при завершении процесса, а не при завершении потока.
  3. Security. Процесс имеет фиксированный токен безопасности. С другой стороны, поток может выдавать себя за других пользователей / токенов.

Если вы хотите больше, ответ Скотта Лэнгхэма в значительной степени охватывает все. Все это с точки зрения операционной системы. Различные языки могут реализовывать разные концепции, такие как задачи, легковесные потоки и т. Д., Но это всего лишь способы использования потоков (волокон в Windows). Нет аппаратных и программных потоков. Существуют аппаратные и программные исключения и прерывания , или пользовательский режим и ядро ​​ потоки .

6 голосов
/ 21 декабря 2012
  1. Поток выполняется в общем пространстве памяти, но процесс выполняется в отдельном пространстве памяти
  2. Нить - это процесс с малым весом, но процесс с большим весом.
  3. Поток - это подтип процесса.
6 голосов
/ 20 июля 2017
  1. По сути, поток является частью процесса, без которого поток процесса не сможет работать.
  2. Нить легкая, а процесс тяжелый.
  3. связь между процессом требует некоторого времени, тогда как потоку требуется меньше времени.
  4. Потоки могут совместно использовать одну и ту же область памяти, тогда как процесс живет в отдельной.
6 голосов
/ 24 декабря 2012

Процесс : выполняемая программа называется процессом

Поток : Поток - это функциональность, которая выполняется с другой частью программы на основе концепции «один с другим», поэтому поток является частью процесса.

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