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

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

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

Ответы [ 33 ]

5 голосов
/ 10 октября 2015

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

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

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

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

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

Processes and Threads

4 голосов
/ 14 августа 2016

Попытка ответить на него из OS Linux Kernel View

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

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

4 голосов
/ 17 июля 2015

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

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

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

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

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

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


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

3 голосов
/ 27 ноября 2018

Лучший ответ

Процесс:

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

Тема:

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

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

3 голосов
/ 15 декабря 2017

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

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

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

3 голосов
/ 19 апреля 2016

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

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

2 голосов
/ 28 апреля 2014

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

1 голос
/ 12 марта 2019

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

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

enter image description here

1 голос
/ 06 сентября 2018

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

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