Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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


Нашел это на MSDN здесь:
О процессах и потоках

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

Процесс:

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

Нить:

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

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

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

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

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

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

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

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

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 и Одновременная многопоточность (сокращенно СМТ).

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

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

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

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

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

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

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

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

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

Имея в виду обычного человека,

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

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

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

Украдено из здесь.

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

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

Пример из реальной жизни для процесса и потока Это даст вам основное представление о потоке и процессе. enter image description here

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

Процесс:

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

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

Потоки:

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

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

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

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

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

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

Процесс

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

Нить

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

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

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

Вт, 6 августа 1996 г., 12:47:31 +0300 (летнее европейское время)

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

Следующее сообщение:Бернд П.Циллер:"Ре:К сожалению, в get_hash_table"

Предыдущее сообщение:Линус Торвальдс:"Ре:Порядок запросов ввода-вывода"

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

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

НЕТ!

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

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

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

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

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

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

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

клон(CLONE_VM|CLONE_FS);

ребенок:execve("внешний-cd");

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

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

клон (CLONE_VM);

ребенок:продолжайте работать, в конечном итоге execve()

мать:дождаться исполнения

  • вы можете использовать внешние «IO демоны»:

клон (CLONE_FILES);

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

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

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

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

Подумайте, например, о многопоточном «inetd».Вам нужен низкий накладной вил+exec, так что с помощью Linux можно вместо использования «fork ()», вы пишете многопоточный inetd, где каждый поток создан с помощью просто clone_vm (общее адресное пространство, но не делитесь файлом дескрипторы и т. Д.).Тогда ребенок может выполнять, если это был внешний сервис (например, Rlogind), или, может быть, это была одна из внутренних услуг INETD (Echo, TimeOf), и в этом случае он просто делает свою вещь и выходит.

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

Линус

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Processes and Threads

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

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

Лучший ответ

Процесс:

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

Нить:

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

ссылка-https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top