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


1643

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

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



4
Вероятно, стоит сказать, что у каждой ОС есть свое представление о том, что такое «поток» или «процесс». Некоторые основные ОС «не имеют понятия« поток », есть также некоторые встроенные ОС», которые имеют только «потоки».
Нил

Ответы:


1460

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

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

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


56
Аппаратные потоки, вероятно, ссылаются на контексты нескольких потоков внутри ядра (например, HyperThreading, SMT, Sun's Niagara / Rock). Это означает дублирование файлов регистра, дополнительные биты, переносимые с инструкцией по конвейерам, и более сложную логику обхода / пересылки, среди прочего.
Мэтт Дж

4
@greg, одно сомнение у меня в темах. позвольте мне рассмотреть, у меня есть процесс A, который получил некоторое пространство в оперативной памяти. Если процесс A создает поток, поток также должен иметь некоторое пространство для выполнения. Так увеличит ли это размер пространства, созданного для процесса А, или пространство для потока, созданного где-то еще? Так что же создает этот процесс в виртуальном пространстве? Пожалуйста, поправьте меня, если мой вопрос неправильный. Спасибо
duslabo

9
@JeshwanthKumarNK: при создании нового потока выделяется как минимум достаточно памяти для нового стека. Эта память выделяется ОС в процессе А.
Грег Хьюгилл,

24
Этот ответ кажется неправильным. Если бы оба процесса и потоки были независимыми последовательностями выполнения, то процесс, который содержал два потока, должен был бы иметь три последовательности выполнения, и это не может быть правильным. Только поток является последовательностью выполнения - процесс - это контейнер, который может содержать одну или несколько последовательностей выполнения.
Дэвид Шварц

8
«Аппаратные потоки» - это потоки, которым предоставляются отдельные аппаратные ресурсы (отдельное ядро, процессор или гиперпотоки). «Программные потоки» - это потоки, которые должны конкурировать за одинаковую вычислительную мощность.
jpmc26

811

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

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


Эта информация была найдена в Документах Microsoft здесь: О процессах и потоках

Microsoft Windows поддерживает вытесняющую многозадачность, которая создает эффект одновременного выполнения нескольких потоков из нескольких процессов. На многопроцессорном компьютере система может одновременно выполнять столько потоков, сколько имеется процессоров на компьютере.


18
Для людей, которые хотят знать, почему вы не можете одновременно отформатировать дискету: stackoverflow.com/questions/20708707/…
Computernerd

7
@LuisVasconcellos - если бы не было потоков, то процесс ничего бы не сделал. В процессе будет загружен только некоторый код и состояние программы. Это не очень полезно. Это было бы похоже на дорогу без транспортных средств по ней.
Скотт Лэнгхэм

4
@LuisVasconcellos - Хорошо. Да, вы можете думать о потоке как о чем-то, что проходит через код процесса и выполняет инструкции в этом коде.
Скотт Лэнгхэм

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

4
@BKSpurgeon С каждым объяснением вы должны поднять своего читателя с одного уровня понимания на следующий. К сожалению, я не могу адаптировать ответ для каждого читателя и поэтому должен принять уровень знаний. Для тех, кто не знает, они могут продолжить поиск терминов, которые я использую, они не понимают, не так ли, пока они не достигнут базовой точки, которую они действительно понимают. Я собирался предложить вам свой ответ, но рад видеть, что вы уже получили.
Скотт Лэнгхэм

301

Обработать:

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

Нить:

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

Я позаимствовал вышеупомянутую информацию из Quest Knowledge! блог .


90
Кумар: Насколько мне известно, потоки не разделяют один и тот же стек. В противном случае было бы невозможно запустить разные коды для каждого из них.
Михай Неаксу

27
Да, я думаю, что @MihaiNeacsu прав. Потоки совместно используют «код, данные и файлы» и имеют свои собственные «регистры и стек». Слайд из моего курса по ОС: i.imgur.com/Iq1Qprv.png
Shehaaz

Это весьма полезно, поскольку в нем подробно рассматриваются, что такое потоки и процессы и как они связаны друг с другом. Я бы предложил добавить пример потока, тем более, что есть один для процесса. Хорошая вещь!
Смитерс

1
Kquest.co.cc ссылки не работают.
Элайджа Линн

1
@ Rndp13 Проблема заключается только в использовании слова «стек», а не «стеки». Потоки делят стеки, так как стек является лишь частью виртуальной памяти, а потоки разделяют всю виртуальную память. Потоки могут даже хранить свои указатели стека, и выполнение может быть возобновлено другим потоком без проблем. То, что один поток выполняет один стек в одно конкретное время, не означает, что потоки не совместно используют стеки, как тот факт, что один поток одновременно работает с файловым дескриптором, не означает, что потоки не совместно используют файловые дескрипторы. ,
Дэвид Шварц

129

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

У нас есть следующее из раздела 2.2.2 Модель классической резьбы в современных операционных системах 3e от Tanenbaum:

Модель процесса основана на двух независимых концепциях: группировка ресурсов и выполнение. Иногда полезно разделить их; это где темы приходят ....

Он продолжает:

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

Далее он предоставляет следующую таблицу:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

Давайте разберемся с проблемой аппаратного многопоточности . Классически, ЦП будет поддерживать один поток выполнения, поддерживая состояние потока с помощью одного счетчика программы и набора регистров. Но что произойдет, если пропадет кеш? Извлечение данных из основной памяти занимает много времени, и пока это происходит, процессор просто бездействует. Таким образом, у кого-то возникла идея в основном иметь два набора состояний потока (ПК + регистры), чтобы другой поток (может быть, в том же процессе, может быть, в другом процессе) мог выполнить работу, пока другой поток ожидает в основной памяти. Существует несколько имен и реализаций этой концепции, таких как HyperThreading и одновременное многопоточность (для краткости SMT).

Теперь давайте посмотрим на сторону программного обеспечения. Есть три основных способа реализации потоков на стороне программного обеспечения.

  1. Темы в пользовательском пространстве
  2. Потоки ядра
  3. Сочетание двух

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

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

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

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


4
Отличный ответ! Это ломает много жаргона и предположений. Это делает эту строку неуклюжей, хотя: «Итак, у кого-то возникла идея иметь два набора состояний потоков (ПК + регистры)» - о чем здесь упоминается «ПК»?
Смитерс

2
@Smithers ПК - это программный счетчик или указатель команд, который дает адрес следующей команды, которая должна быть выполнена: en.wikipedia.org/wiki/Program_counter
Роберт С. Барнс


Почему «Стек» не указан в разделе «Для элементов процесса»? Оба процесса и потоки имеют свой собственный стек.
stackoverflowuser2010

1
@ stackoverflowuser2010 не только потоки имеют стеки. То, что вы называете процессом, - это процесс с одним потоком выполнения, и этот поток имеет стек, а не процесс.
Роберт С. Барнс

101

Чтобы объяснить больше в отношении параллельного программирования

  1. Процесс имеет автономную среду выполнения. Процесс обычно имеет полный, частный набор основных ресурсов времени выполнения; в частности, каждый процесс имеет свое собственное пространство памяти.

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

Помня среднего человека,

На вашем компьютере откройте Microsoft Word и веб-браузер. Мы называем эти два процесса .

В Microsoft Word вы вводите какую-то вещь, и она автоматически сохраняется. Теперь вы бы заметили, что редактирование и сохранение происходит параллельно - редактирование в одном потоке и сохранение в другом.


14
Отличный ответ, он делает вещи простыми и предоставляет пример, к которому может относиться каждый пользователь, даже просматривающий вопрос.
Смитерс

7
редактирование / сохранение было хорошим примером для нескольких потоков внутри процесса!

53

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

Украдена отсюда .


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

1
Хороший ответ (особенно с кредитованием), так как он показывает связь между двумя и segues в легко ожидаемый «следующий вопрос» (о волокнах).
Смитерс

29

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


27

Пример реального процесса и потока Это даст вам базовое представление о потоке и процессе введите описание изображения здесь

Я заимствовал вышеупомянутую информацию от Ответа Скотта Лэнгэма - спасибо


25

Обработать:

  1. Процесс тяжелый процесс веса.
  2. Процесс представляет собой отдельную программу, которая имеет отдельную память, данные, ресурсы и т. Д.
  3. Процесс создается с использованием метода fork ().
  4. Переключение контекста между процессами занимает много времени.

Пример:
скажем, открытие любого браузера (Mozilla, Chrome, IE). В этот момент новый процесс начнет выполняться.

Потоки:

  1. Нити - это легковесные процессы. Нити связаны внутри процесса.
  2. Потоки имеют общую память, данные, ресурсы, файлы и т. Д.
  3. Потоки создаются методом clone ().
  4. Переключение контекста между потоками не так много времени, как процесс.

Пример:
открытие нескольких вкладок в браузере.


В мире Windows вы правы, но в Linux каждый «поток» является процессом и одинаково «тяжелым» (или легким).
Нил

22
  • Каждый процесс является потоком (основной поток).
  • Но каждый поток это не процесс. Это часть (сущность) процесса.

3
Можете ли вы объяснить это немного дальше и / или включить некоторые доказательства?
Zim84

15

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

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

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


13

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

Обработать

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

Нить

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

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


13

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

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

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

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

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

Клон (CLONE_VM | CLONE_FS);

child: execve ("external-cd");

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

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

Клон (CLONE_VM);

ребенок: продолжать бегать, в конце концов исполнить ()

мама: жди execve

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

клон (CLONE_FILES);

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

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

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

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

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

Вы не можете сделать это с "потоком" / "процессом".

Линус


12

Пытаюсь ответить на него из представления ОС Linux Kernel

Программа становится процессом при запуске в память. Процесс имеет свое собственное адресное пространство, то есть имеет различные сегменты в памяти, такие как .textсегмент для хранения скомпилированного кода, .bssдля хранения неинициализированных статических или глобальных переменных и т. Д.
Каждый процесс будет иметь свой собственный программный счетчик и стек пользовательского пространства .

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

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

Внутри ядра каждый поток имеет свой собственный стек ядра вместе со task_structструктурой, которая определяет поток. Поэтому ядро ​​рассматривает потоки одного и того же процесса как разные объекты и является планируемым в себе. Потоки в одном и том же процессе имеют общий идентификатор, называемый идентификатором группы потоков ( tgid), также они имеют уникальный идентификатор, называемый идентификатором процесса ( pid).


11

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

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

Например:

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

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


1
Хороший ответ, мне нравится, что он определяет свою сферу (мир Java) и предоставляет некоторые применимые примеры - включая один (# 2), к которому может немедленно обратиться любой, кто должен задать оригинальный вопрос.
Смитерс

9

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

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

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

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

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

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

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

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

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


9

Следующее - то, что я получил от одной из статей о Проекте Кода . Я думаю, это объясняет все, что нужно четко.

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


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

Не ясно. Означает ли это только один процесс и его потоки? Что если есть много процессов с большим количеством потоков в каждом? Все эти потоки разделяют одно пространство памяти? Из всех этих процессов?
Зеленый,

9

Обработать:

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

Нить:

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

ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread


Похоже, параллелизм Node в одном процессе против многопоточного параллелизма другого языка
user2734550

Это буквально скопировано из ответа ниже 2010 года ...
mc01

8

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

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

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


Когда вы говорите «токен безопасности», вы имеете в виду учетные данные пользователя (имя пользователя / пароль), например, в linux?

В окнах это сложная тема, токен безопасности (фактически называемый токеном доступа) - это большая структура, содержащая всю информацию, необходимую для проверки доступа. Структура создается после авторизации, что означает отсутствие имени пользователя / пароля, но список идентификаторов безопасности / прав на основе имени пользователя / пароля. Более подробная информация здесь: msdn.microsoft.com/en-us/library/windows/desktop/…
AndreiM

8
  1. Поток выполняется в общей области памяти, но процесс выполняется в отдельной области памяти
  2. Нить - это легкий процесс, но процесс это тяжелый процесс.
  3. Поток - это подтип процесса.

Это кажется очень рекурсивным. Возможно, было бы лучше ответить, если бы связь между потоком и процессом была расширена.
Смитерс

7

Для тех, кто более удобен в обучении с помощью визуализации, вот удобная диаграмма, которую я создал, чтобы объяснить процессы и потоки.
Я использовал информацию из MSDN - О процессах и потоках

Процессы и потоки


1
Может быть интересно добавить еще один процесс, просто чтобы увидеть, как многопоточность сравнивается с многопроцессорностью.
Брэм Ванрой

6

Исходя из мира встраиваемых систем, я хотел бы добавить, что концепция процессов существует только в «больших» процессорах (процессоры для настольных ПК, ARM Cortex A-9 ), которые имеют MMU (модуль управления памятью), и операционных системах, которые поддерживают использование MMU ( такой как Linux ). С небольшими / старыми процессорами и микроконтроллерами и небольшой операционной системой RTOS (операционная система реального времени ), такой как freeRTOS, поддержка MMU отсутствует и, следовательно, нет процессов, а есть только потоки.

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

Процессы , с другой стороны, живут в своей собственной изолированной программной среде виртуальной памяти, предоставляемой и защищаемой MMU. Это удобно, потому что позволяет:

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

6
  1. По сути, поток является частью процесса, без которого поток процесса не сможет работать.
  2. Нить легкая, тогда как процесс тяжелый.
  3. связь между процессом требует некоторого времени, тогда как потоку требуется меньше времени.
  4. Потоки могут совместно использовать одну и ту же область памяти, в то время как процесс находится в отдельности.

6

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

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


Неплохо, хотя и вводит новую концепцию («один с другим»), которая, вероятно, чужд человеку, задающему вопрос.
Смитерс

Сообщение отформатировано как код, но должно быть обычным текстом.
Генрих

6

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

У нас есть 3 темы, работающие одновременно над одним документом, например, Libre Office . Первый выполняет проверку орфографии, подчеркивая, что слово написано с ошибкой. Второй берет и печатает буквы с клавиатуры. И последний действительно сохраняет документ через каждые короткие промежутки времени, чтобы не потерять работающий документ, если что-то пойдет не так. В этом случае 3 потока не могут быть 3 процессами, поскольку они совместно используют общую память, которая является адресным пространством их процесса, и, таким образом, все имеют доступ к редактируемому документу. Итак, дорога - это документ Word вместе с двумя бульдозерами, которые являются нитями, хотя в одном из них отсутствует изображение.

введите описание изображения здесь


5

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

Многоядерные системы могут осуществлять несколько потоков выполнения, поэтому Python должен поддерживать многопоточность. Но Python - это не скомпилированный язык, а интерпретируемый язык 1 . Это означает, что программа должна быть интерпретирована для запуска, и интерпретатор не знает о программе до того, как она начнет выполняться. Однако он знает правила Python, и затем он динамически применяет эти правила. Оптимизация в Python должна быть главным образом оптимизацией самого интерпретатора, а не кода, который должен быть запущен. Это отличается от скомпилированных языков, таких как C ++, и имеет последствия для многопоточности в Python. В частности, Python использует глобальную блокировку интерпретатора для управления многопоточностью.

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

В современных средах интерпретатор Python должен разрешать многопоточность, и это должно быть безопасным и эффективным. В этом и заключается разница между интерпретируемым языком и компилируемым языком. Интерпретатор не должен мешать внутреннему обмену данными из разных потоков, в то же время оптимизируя использование процессоров для вычислений.

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

В Python данные защищены от одновременного доступа разными потоками с помощью Global Interpreter Lock. Это требует, чтобы в любой программе Python в каждый момент времени мог выполняться только один поток. С другой стороны, можно запускать несколько процессов, поскольку память для каждого процесса изолирована от любого другого процесса, и процессы могут работать на нескольких ядрах.


1 Дональд Кнут имеет хорошее объяснение интерпретирующих процедур в «Искусстве компьютерного программирования: фундаментальные алгоритмы».


4

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

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


4

Лучший ответ, который я нашел до сих пор, это «Интерфейс программирования Linux» Майкла Керриска :

В современных реализациях UNIX каждый процесс может иметь несколько потоков выполнения. Один из способов представления потоков - это набор процессов, которые совместно используют одну и ту же виртуальную память, а также ряд других атрибутов. Каждый поток выполняет один и тот же программный код и использует одну и ту же область данных и кучу. Однако каждый поток имеет свой собственный стек, содержащий локальные переменные и информацию о связи вызовов функций. [LPI 2.12]

Эта книга является источником большой ясности; Джулия Эванс упомянула свою помощь в разъяснении того, как группы Linux действительно работают в этой статье .


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

Вот как я это прочитал: выбросьте слово «иметь» в первом предложении. С точки зрения терминологии у вас останется 1) один поток и 2) группировка потоков, которая для удобства называется процессом. Это мое мнение о том, что Керриск после здесь.
Зак Валента

Я думаю, что он пытается сказать, что если вы привыкли к старому представлению UNIX, что процессы - это то, что планирует ОС, тогда набор потоков подобен набору процессов, за исключением того, что они разделяют кучу вещей.
Дэвид Шварц

Правильно! Хороший способ выразить это.
Зак Валента

3

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


3

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


Не могли бы вы расширить свой ответ?
Fiver

3
Поток - это подпроцесс, они совместно используют общие ресурсы, такие как код, данные, файлы внутри процесса. В то время как два процесса не могут совместно использовать ресурсы (исключение составляет случай, когда процесс (родительский) разветвляется для создания другого процесса (дочернего), тогда по умолчанию они могут совместно использовать ресурсы.), требует высокой полезной нагрузки на ресурсы для ЦП, тогда как потоки в этом контексте намного легче. Хотя оба имеют одни и те же вещи. В сценарии рассмотрим однопоточный процесс, заблокированный из-за I / 0, тогда вся 1 перейдет к состояние ожидания, но когда многопоточный процесс блокируется вводом / выводом, то только его 1 поток, связанный с вводом / выводом, будет заблокирован.
Насир Уль Ислам Батт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.