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

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

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

Связанный: stackoverflow.com/questions/32294367/…

zxq9 16.08.2017 17:24

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

Neil 22.08.2018 19:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1 750
2
1 220 206
36
Перейти к ответу Данный вопрос помечен как решенный

Ответы 36

Ответ принят как подходящий

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

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

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

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

Matt J 06.03.2009 09:10

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

duslabo 20.09.2012 19:45

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

Greg Hewgill 20.09.2012 23:20

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

David Schwartz 28.05.2016 03:37

Пожалуйста, определите «последовательность выполнения». Что это ИМЕННО означает в контексте кода? Это функция? Это что-то совершенно другое, чем я предполагаю здесь? Мне недостаточно понять это предложение.

PositiveGuy 08.07.2016 02:22

@WTF: используя ужасную аналогию, если одна «последовательность выполнения» - это поиск паука от одной инструкции к другой, следуя тому, что говорит ваш исходный код (циклы, операторы if, вызовы функций и т. д.), То две последовательности выполнения - это две пауки, каждый делает свое дело. Что касается ЦП, каждая последовательность выполнения имеет свой собственный набор регистров, который включает в себя как регистры данных, так и указатель команд.

Greg Hewgill 08.07.2016 02:27

@GregHewgill, спасибо. Я предполагаю, что моя проблема в том, что я думал, что последовательность выполнения - это функция ... как функция в коде

PositiveGuy 08.07.2016 02:28

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

jpmc26 19.01.2017 22:02

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

Alexander Mills 19.03.2017 10:55

Приносим извинения, если это уже было рассмотрено, комментарии здесь много читаются, я просто хотел бы указать, что «аппаратные потоки» (из-за отсутствия знаний в ответе) - это потоки ЦП (используемые в отношении многопоточности Core или многопоточные процессоры - Dual Core, Duo Core (разница в этих двух ссылках на ЦП - 2 ядра 2 потока (Dual), против 1 ядра 2 потока (Duo)))

Wayne 06.12.2017 07:22

Читая этот ответ, возможно ли использование потоков на однопроцессорных архитектурах?

Dean P 17.07.2020 14:04

An application consists of one or more processes. A process, in the simplest terms, is an executing program. One or more threads run in the context of the process. A thread is the basic unit to which the operating system allocates processor time. A thread can execute any part of the process code, including parts currently being executed by another thread. A fiber is a unit of execution that must be manually scheduled by the application. Fibers run in the context of the threads that schedule them.

Похищено с здесь.

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

Arafangion 12.03.2009 06:05

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

Smithers 20.01.2015 21:04

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

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

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

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

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

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


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

Microsoft Windows supports preemptive multitasking, which creates the effect of simultaneous execution of multiple threads from multiple processes. On a multiprocessor computer, the system can simultaneously execute as many threads as there are processors on the computer.

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

Ali.Mojtehedy 13.12.2013 12:20

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

Computernerd 20.12.2013 21:34

почему каждому процессу всегда нужен хотя бы 1 поток? теоретически, что бы произошло, если бы у процесса было 0 потоков?

user645579 30.03.2015 18:25

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

Scott Langham 31.03.2015 15:59

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

Solomon Slow 23.03.2016 16:50

с величайшим уважением, сэр, этот ответ относится к тем, кто уже знает, и не помогает тем, кто не знает. он читается как статья в Википедии.

BKSpurgeon 06.07.2016 01:55

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

Scott Langham 06.07.2016 23:48

@jvriesem Расшифровывается как Microsoft Developer Network. Это их веб-сайт документации, который они переименовали в Microsoft Docs. Спасибо за толчок, обновлю ответ.

Scott Langham 26.05.2020 14:08

Процесс:

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

Нить:

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

Приведенную выше информацию я позаимствовал из Квест знаний! блог.

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

Mihai Neacsu 24.04.2013 03:51

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

Shehaaz 24.10.2013 21:22

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

Smithers 20.01.2015 21:02

Ссылки на Kquest.co.cc мертвы.

Elijah Lynn 27.04.2015 15:50

@Kumar Пожалуйста, исправьте ответ относительно части потоков с совместным использованием стека. Это создает путаницу.

Rndp13 10.10.2018 13:48

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

Michel Hanna 18.12.2018 04:34

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

David Schwartz 17.02.2019 22:40
  1. Поток выполняется в общем пространстве памяти, но процесс выполняется в отдельном пространстве памяти.
  2. Поток - это легкий процесс, но процесс тяжелый.
  3. Поток - это подтип процесса.

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

Smithers 20.01.2015 20:58

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

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

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

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

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

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

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

Smithers 20.01.2015 21:00

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

user645579 30.03.2015 18:47

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

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

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

Smithers 20.01.2015 20:53

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

Jan Heinrich Reimer 08.06.2017 19:54

Вот что я получил из одной из статей о Кодовый проект. Я думаю, это ясно объясняет все необходимое.

A thread is another mechanism for splitting the workload into separate execution streams. A thread is lighter weight than a process. This means, it offers less flexibility than a full blown process, but can be initiated faster because there is less for the Operating System to set up. When a program consists of two or more threads, all the threads share a single memory space. Processes are given separate address spaces. all the threads share a single heap. But each thread is given its own stack.

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

Smithers 20.01.2015 21:01

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

Green 07.12.2017 11:21

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

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

Например:

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

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

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

Smithers 20.01.2015 20:55
  • Каждый процесс - это поток (первичный поток).
  • Но каждый поток - это не процесс. Это часть (сущность) процесса.

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

Zim84 10.08.2013 00:47

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

У нас есть следующее в разделе 2.2.2 Классическая модель резьбыСовременные операционные системы 3e Таненбаума:

The process model is based on two independent concepts: resource grouping and execution. Sometimes it is use­ful to separate them; this is where threads come in....

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

One way of looking at a process is that it is a way to group related resources together. A process has an address space containing program text and data, as well as other resources. These resource may include open files, child processes, pending alarms, signal handlers, accounting information, and more. By putting them together in the form of a process, they can be managed more easily. The other concept a process has is a thread of execution, usually shortened to just thread. The thread has a program counter that keeps track of which instruc­tion to execute next. It has registers, which hold its current working variables. It has a stack, which contains the execution history, with one frame for each proce­dure called but not yet returned from. Although a thread must execute in some process, the thread and its process are different concepts and can be treated sepa­rately. Processes are used to group resources together; threads are the entities scheduled for execution on the CPU.

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

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        |

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

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

  1. Потоки пользовательского пространства
  2. Потоки ядра
  3. Комбинация двух

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

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

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

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

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

Smithers 20.01.2015 20:50

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

Robert S. Barnes 21.01.2015 13:47

Я вижу что ты тут делал. stackoverflow.com/questions/1762418/process-vs-thread/…

Alexander Gonchiy 05.08.2015 00:54

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

sprksh 17.02.2020 16:37

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

Minh Nghĩa 14.03.2020 14:25

Очень хорошо объяснено. Спасибо

Aydin Homay 05.08.2020 12:15

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

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

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

Here’s a summary of the differences between threads and processes:

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

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

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

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

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

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

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

Fiver 28.04.2014 01:47

Поток - это подпроцесс, они разделяют общие ресурсы, такие как код, данные, файлы внутри процесса. В то время как два процесса не могут совместно использовать ресурсы (Исключение составляют случаи, когда процесс (родительский) форк создает другой процесс (дочерний), то по умолчанию они могут разделять ресурсы.), требует высокой полезной нагрузки ресурсов для ЦП, тогда как потоки в этом контексте намного легче. Хотя оба обладают одинаковыми вещами. Сценарий, рассмотрим, что однопоточный процесс заблокирован из-за I / 0, тогда весь 1 пойдет в состояние ожидания, но когда многопоточный процесс блокируется вводом-выводом, тогда будет заблокирован только 1 соответствующий поток ввода-вывода.

Nasir Ul Islam Butt 10.05.2014 22:40

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

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

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

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

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

user645579 30.03.2015 18:13

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

AndreiM 01.04.2015 11:21

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

Процесс

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

Нить

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

- Взято из операционной системы Гэлвином.

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

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

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

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

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

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


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

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

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

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

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

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

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

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

Поток - это управляемая единица выполнения, или, проще говоря, выполнение последовательности инструкций.

Попытка ответить на него из обзора ОС ядра Linux

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

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

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

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

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

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

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

Процесс:

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

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

Потоки:

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

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

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

Neil 22.08.2018 19:35

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

In modern UNIX implementations, each process can have multiple threads of execution. One way of envisaging threads is as a set of processes that share the same virtual memory, as well as a range of other attributes. Each thread is executing the same program code and shares the same data area and heap. However, each thread has it own stack containing local variables and function call linkage information. [LPI 2.12]

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

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

David Schwartz 17.02.2019 22:37

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

Zach Valenta 18.02.2019 02:46

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

David Schwartz 18.02.2019 08:12

Верно! Хороший способ выразиться.

Zach Valenta 18.02.2019 17:39

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

Processes and Threads

Может быть интересно добавить процесс Другая, чтобы увидеть, как многопоточность сравнивается с многопроцессорностью.

Bram Vanroy 15.06.2018 13:10

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

Linus Torvalds ([email protected])

Tue, 6 Aug 1996 12:47:31 +0300 (EET DST)

Messages sorted by: [ date ][ thread ][ subject ][ author ]

Next message: Bernd P. Ziller: "Re: Oops in get_hash_table"

Previous message: Linus Torvalds: "Re: I/O request ordering"

On Mon, 5 Aug 1996, Peter P. Eiserloh wrote:

We need to keep a clear the concept of threads. Too many people seem to confuse a thread with a process. The following discussion does not reflect the current state of linux, but rather is an attempt to stay at a high level discussion.

NO!

There is NO reason to think that "threads" and "processes" are separate entities. That's how it's traditionally done, but I personally think it's a major mistake to think that way. The only reason to think that way is historical baggage.

Both threads and processes are really just one thing: a "context of execution". Trying to artificially distinguish different cases is just self-limiting.

A "context of execution", hereby called COE, is just the conglomerate of all the state of that COE. That state includes things like CPU state (registers etc), MMU state (page mappings), permission state (uid, gid) and various "communication states" (open files, signal handlers etc). Traditionally, the difference between a "thread" and a "process" has been mainly that a threads has CPU state (+ possibly some other minimal state), while all the other context comes from the process. However, that's just one way of dividing up the total state of the COE, and there is nothing that says that it's the right way to do it. Limiting yourself to that kind of image is just plain stupid.

The way Linux thinks about this (and the way I want things to work) is that there is no such thing as a "process" or a "thread". There is only the totality of the COE (called "task" by Linux). Different COE's can share parts of their context with each other, and one subset of that sharing is the traditional "thread"/"process" setup, but that should really be seen as ONLY a subset (it's an important subset, but that importance comes not from design, but from standards: we obviusly want to run standards-conforming threads programs on top of Linux too).

In short: do NOT design around the thread/process way of thinking. The kernel should be designed around the COE way of thinking, and then the pthreads library can export the limited pthreads interface to users who want to use that way of looking at COE's.

Just as an example of what becomes possible when you think COE as opposed to thread/process:

  • You can do a external "cd" program, something that is traditionally impossible in UNIX and/or process/thread (silly example, but the idea is that you can have these kinds of "modules" that aren't limited to the traditional UNIX/threads setup). Do a:

clone(CLONE_VM|CLONE_FS);

child: execve("external-cd");

/* the "execve()" will disassociate the VM, so the only reason we used CLONE_VM was to make the act of cloning faster */

  • You can do "vfork()" naturally (it meeds minimal kernel support, but that support fits the CUA way of thinking perfectly):

clone(CLONE_VM);

child: continue to run, eventually execve()

mother: wait for execve

  • you can do external "IO deamons":

clone(CLONE_FILES);

child: open file descriptors etc

mother: use the fd's the child opened and vv.

All of the above work because you aren't tied to the thread/process way of thinking. Think of a web server for example, where the CGI scripts are done as "threads of execution". You can't do that with traditional threads, because traditional threads always have to share the whole address space, so you'd have to link in everything you ever wanted to do in the web server itself (a "thread" can't run another executable).

Thinking of this as a "context of execution" problem instead, your tasks can now chose to execute external programs (= separate the address space from the parent) etc if they want to, or they can for example share everything with the parent except for the file descriptors (so that the sub-"threads" can open lots of files without the parent needing to worry about them: they close automatically when the sub-"thread" exits, and it doesn't use up fd's in the parent).

Think of a threaded "inetd", for example. You want low overhead fork+exec, so with the Linux way you can instead of using a "fork()" you write a multi-threaded inetd where each thread is created with just CLONE_VM (share address space, but don't share file descriptors etc). Then the child can execve if it was a external service (rlogind, for example), or maybe it was one of the internal inetd services (echo, timeofday) in which case it just does it's thing and exits.

You can't do that with "thread"/"process".

Linus

Различия между процессом и потоком приведены ниже:

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

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

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

Процесс:

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

Нить:

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

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

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

user2734550 19.11.2019 05:21

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

mc01 16.12.2019 23:55

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

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

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

Поток - поток - это выполнение наименьшей последовательности запрограммированных инструкций.

Например, вы хотите вычислить умножение матриц, вы напишете программу для 3 циклов внутри main и выполните ее. Теперь это ваш процесс.

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

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

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


Потоки запускают в параллели в области разделяемой памяти (процесса, который их создал):

Thread 1              Thread 2              Thread 3
   | 
   | 
   |
                         |
                         |
                                               |
                                               |
                                               |
   |
                         |
                         | 
                         |            
Complete             Complete              Complete

Примечание: приведенное выше можно интерпретировать как процесс (т.е. один процесс с 3 потоками).


Процессы работают с параллельно и одновременно:

Process 1              Process 2              Process 3
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
Complete               Complete               Complete

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

hrishi007 26.08.2020 23:12

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

haz 26.11.2020 19:48

Thread - это легкий процесс, в то время как процесс является автономной средой выполнения.

Что подразумевается под «автономным процессом выполнения»? Частный набор основных ресурсов времени выполнения.

Что подразумевается под «частным набором основных ресурсов времени выполнения»? Пространство, выделенное из памяти для запуска процесса (просто пространство в памяти).

Ваш ответ не добавляет ничего, что еще не было предложено многочисленными старыми ответами.

EricSchaefer 18.02.2021 20:23

Другие вопросы по теме