В чем техническая разница между процессом и потоком?
У меня такое ощущение, что слово «процесс» используется слишком часто, и есть также аппаратные и программные потоки. Как насчет легких процессов в таких языках, как Erlang ? Есть ли определенная причина использовать один термин над другим?
multithreading
process
operating-system
Джеймс Фассетт
источник
источник
Ответы:
И процессы, и потоки являются независимыми последовательностями выполнения. Типичное различие заключается в том, что потоки (одного и того же процесса) работают в общем пространстве памяти, а процессы - в отдельных пространствах памяти.
Я не уверен, на какие «аппаратные» и «программные» темы вы могли ссылаться. Потоки - это функция операционной среды, а не функция ЦП (хотя ЦП обычно выполняет операции, которые делают потоки эффективными).
Эрланг использует термин «процесс», потому что он не раскрывает модель многопрограммирования с общей памятью. Называя их «потоками», можно предположить, что они имеют общую память.
источник
Процесс
Каждый процесс предоставляет ресурсы, необходимые для выполнения программы. Процесс имеет виртуальное адресное пространство, исполняемый код, открытые дескрипторы для системных объектов, контекст безопасности, уникальный идентификатор процесса, переменные среды, класс приоритета, минимальный и максимальный размеры рабочего набора и, по крайней мере, один поток выполнения. Каждый процесс запускается с одного потока, часто называемого основным потоком, но может создавать дополнительные потоки из любого его потока.
Поток
Поток - это объект внутри процесса, который можно запланировать для выполнения. Все потоки процесса совместно используют его виртуальное адресное пространство и системные ресурсы. Кроме того, каждый поток поддерживает обработчики исключений, приоритет планирования, локальное хранилище потока, уникальный идентификатор потока и набор структур, которые система будет использовать для сохранения контекста потока до его планирования. Контекст потока включает в себя набор машинных регистров потока, стек ядра, блок среды потока и пользовательский стек в адресном пространстве процесса потока. Потоки также могут иметь собственный контекст безопасности, который можно использовать для олицетворения клиентов.
Эта информация была найдена в Документах Microsoft здесь: О процессах и потоках
источник
Обработать:
Нить:
Я позаимствовал вышеупомянутую информацию из Quest Knowledge! блог .
источник
Сначала давайте посмотрим на теоретический аспект. Вам необходимо понять, что такое концептуально процесс, чтобы понять разницу между процессом и потоком и тем, что между ними.
У нас есть следующее из раздела 2.2.2 Модель классической резьбы в современных операционных системах 3e от Tanenbaum:
Он продолжает:
Далее он предоставляет следующую таблицу:
Давайте разберемся с проблемой аппаратного многопоточности . Классически, ЦП будет поддерживать один поток выполнения, поддерживая состояние потока с помощью одного счетчика программы и набора регистров. Но что произойдет, если пропадет кеш? Извлечение данных из основной памяти занимает много времени, и пока это происходит, процессор просто бездействует. Таким образом, у кого-то возникла идея в основном иметь два набора состояний потока (ПК + регистры), чтобы другой поток (может быть, в том же процессе, может быть, в другом процессе) мог выполнить работу, пока другой поток ожидает в основной памяти. Существует несколько имен и реализаций этой концепции, таких как HyperThreading и одновременное многопоточность (для краткости SMT).
Теперь давайте посмотрим на сторону программного обеспечения. Есть три основных способа реализации потоков на стороне программного обеспечения.
Все, что вам нужно для реализации потоков, - это возможность сохранять состояние процессора и поддерживать несколько стеков, что во многих случаях может быть сделано в пространстве пользователя. Преимущество потоков в пользовательском пространстве заключается в супер-быстром переключении потоков, поскольку вам не нужно захватывать ядро и возможность планировать свои потоки так, как вам нравится. Самым большим недостатком является невозможность блокировать ввод-вывод (который блокировал бы весь процесс и все его пользовательские потоки), что является одной из основных причин, по которым мы используем потоки в первую очередь. Блокировка ввода / вывода с использованием потоков во многих случаях значительно упрощает разработку программы.
Преимущество потоков ядра в том, что они могут использовать блокирующий ввод / вывод, в дополнение к тому, что все проблемы с планированием оставлены для ОС. Но каждое переключение потоков требует захвата в ядро, которое потенциально относительно медленное. Однако, если вы переключаете потоки из-за заблокированного ввода-вывода, это на самом деле не проблема, поскольку операция ввода-вывода, вероятно, в любом случае заманила вас в ядро.
Другой подход заключается в объединении двух потоков с несколькими потоками ядра, каждый из которых имеет несколько пользовательских потоков.
Итак, возвращаясь к вашему вопросу о терминологии, вы можете увидеть, что процесс и поток выполнения - это две разные концепции, и выбор того, какой термин использовать, зависит от того, о чем вы говорите. Что касается термина «облегченный процесс», я лично не вижу в этом смысла, поскольку он на самом деле не передает происходящего, а также термин «поток исполнения».
источник
Чтобы объяснить больше в отношении параллельного программирования
Процесс имеет автономную среду выполнения. Процесс обычно имеет полный, частный набор основных ресурсов времени выполнения; в частности, каждый процесс имеет свое собственное пространство памяти.
Внутри процесса существуют потоки - у каждого процесса есть хотя бы один. Потоки совместно используют ресурсы процесса, включая память и открытые файлы. Это способствует эффективному, но потенциально проблематичному общению.
Помня среднего человека,
На вашем компьютере откройте Microsoft Word и веб-браузер. Мы называем эти два процесса .
В Microsoft Word вы вводите какую-то вещь, и она автоматически сохраняется. Теперь вы бы заметили, что редактирование и сохранение происходит параллельно - редактирование в одном потоке и сохранение в другом.
источник
Украдена отсюда .
источник
Процесс - это набор кода, памяти, данных и других ресурсов. Поток - это последовательность кода, которая выполняется в рамках процесса. Вы можете (обычно) иметь несколько потоков, выполняющихся одновременно в одном и том же процессе.
источник
Пример реального процесса и потока Это даст вам базовое представление о потоке и процессе
Я заимствовал вышеупомянутую информацию от Ответа Скотта Лэнгэма - спасибо
источник
Обработать:
Пример:
скажем, открытие любого браузера (Mozilla, Chrome, IE). В этот момент новый процесс начнет выполняться.
Потоки:
Пример:
открытие нескольких вкладок в браузере.
источник
источник
И потоки, и процессы являются атомарными единицами распределения ресурсов ОС (т. Е. Существует модель параллелизма, описывающая, как процессорное время распределяется между ними, и модель владения другими ресурсами ОС). Есть разница в:
Грег Хьюгилл (Greg Hewgill) выше был прав насчет значения слова «процесс» на языке Erlang, и здесь обсуждается, почему Erlang может делать процессы более легкими.
источник
И процессы, и потоки являются независимыми последовательностями выполнения. Типичное различие заключается в том, что потоки (одного и того же процесса) работают в общем пространстве памяти, а процессы - в отдельных пространствах памяти.
Обработать
Программа в исполнении. в нем есть текстовый раздел, т.е. программный код, текущая активность, представленная значением счетчика программы и содержимым регистра процессоров. Он также включает в себя стек процессов, который содержит временные данные (такие как параметры функций, адреса возврата и локальные переменные), и раздел данных, который содержит глобальные переменные. Процесс также может включать в себя кучу, которая является памятью, которая динамически выделяется во время выполнения процесса.
Нить
Поток - это базовая единица загрузки процессора; он содержит идентификатор потока, счетчик программ, набор регистров и стек. он разделил с другими потоками, принадлежащими к тому же процессу, свой раздел кода, раздел данных и другие ресурсы операционной системы, такие как открытые файлы и сигналы.
- взято из операционной системы от Galvin
источник
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
источник
Пытаюсь ответить на него из представления ОС Linux Kernel
Программа становится процессом при запуске в память. Процесс имеет свое собственное адресное пространство, то есть имеет различные сегменты в памяти, такие как
.text
сегмент для хранения скомпилированного кода,.bss
для хранения неинициализированных статических или глобальных переменных и т. Д.Каждый процесс будет иметь свой собственный программный счетчик и стек пользовательского пространства .
Внутри ядра каждый процесс будет иметь свой собственный стек ядра (который отделен от стека пространства пользователя для проблем безопасности) и структуру,
task_struct
которая обычно называется абстрагированной как блок управления процессом, храня всю информацию, касающуюся процесса, такую как его приоритет, состояние (и многое другое).Процесс может иметь несколько потоков исполнения.
Что касается потоков, они находятся внутри процесса и совместно используют адресное пространство родительского процесса вместе с другими ресурсами, которые могут быть переданы при создании потока, такими как ресурсы файловой системы, совместное использование ожидающих сигналов, совместное использование данных (переменных и инструкций), что делает потоки легкими и следовательно, позволяет более быстрое переключение контекста.
Внутри ядра каждый поток имеет свой собственный стек ядра вместе со
task_struct
структурой, которая определяет поток. Поэтому ядро рассматривает потоки одного и того же процесса как разные объекты и является планируемым в себе. Потоки в одном и том же процессе имеют общий идентификатор, называемый идентификатором группы потоков (tgid
), также они имеют уникальный идентификатор, называемый идентификатором процесса (pid
).источник
Попытка ответить на этот вопрос, касающийся мира Java.
Процесс - это выполнение программы, но поток - это отдельная последовательность выполнения внутри процесса. Процесс может содержать несколько потоков. Поток иногда называют облегченным процессом .
Например:
Пример 1: JVM работает в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Вот почему несколько потоков могут обращаться к одному и тому же объекту. Потоки разделяют кучу и имеют свое собственное пространство стека. Таким образом, вызов одного потока метода и его локальных переменных защищен потоком от других потоков. Но куча не является потокобезопасной и должна быть синхронизирована для безопасности потока.
Пример 2: Программа может быть не в состоянии рисовать картинки, читая нажатия клавиш. Программа должна уделять все свое внимание вводу с клавиатуры, а отсутствие возможности обрабатывать более одного события одновременно может привести к проблемам. Идеальным решением этой проблемы является плавное выполнение двух или более разделов программы одновременно. Темы позволяют нам сделать это. Здесь Рисование изображения - это процесс, а чтение нажатия клавиши - это подпроцесс (поток).
источник
Разница между потоком и процессом?
Процесс - это исполняемый экземпляр приложения, а поток - это путь выполнения внутри процесса. Кроме того, процесс может содержать несколько потоков. Важно отметить, что поток может делать все, что может делать процесс. Но поскольку процесс может состоять из нескольких потоков, поток можно считать «легким» процессом. Таким образом, существенным отличием потока от процесса является работа, которую каждый выполняет для выполнения. Потоки используются для небольших задач, тогда как процессы используются для более «тяжелых» задач - в основном для выполнения приложений.
Другое различие между потоком и процессом заключается в том, что потоки в одном и том же процессе совместно используют одно и то же адресное пространство, а разные процессы - нет. Это позволяет потокам считывать и записывать одни и те же структуры данных и переменные, а также облегчает связь между потоками. Связь между процессами, также известная как IPC, или межпроцессное взаимодействие, является довольно сложной и ресурсоемкой.
Потоки легче создавать, чем процессы, поскольку они не требуют отдельного адресного пространства.
Многопоточность требует тщательного программирования, поскольку потоки совместно используют структуры данных, которые могут быть изменены только одним потоком за раз. В отличие от потоков, процессы не используют одно и то же адресное пространство.
Потоки считаются легкими, поскольку они используют гораздо меньше ресурсов, чем процессы.
Процессы не зависят друг от друга. Потоки, поскольку они совместно используют одно и то же адресное пространство, являются взаимозависимыми, поэтому следует соблюдать осторожность, чтобы разные потоки не наступали друг на друга.
Это действительно другой способ заявить # 2 выше.
Процесс может состоять из нескольких потоков.
источник
Следующее - то, что я получил от одной из статей о Проекте Кода . Я думаю, это объясняет все, что нужно четко.
источник
Обработать:
Процесс в основном программа в исполнении. Это активный субъект. Некоторые операционные системы используют термин «задача» для обозначения выполняемой программы. Процесс всегда сохраняется в основной памяти, также называемой основной памятью или оперативной памятью. Следовательно, процесс называется активным субъектом. Исчезает, если машина перезагружена. Несколько процессов могут быть связаны с одной и той же программой. В многопроцессорной системе несколько процессов могут выполняться параллельно. В однопроцессорной системе, хотя истинный параллелизм не достигается, применяется алгоритм планирования процессов, и процессор планирует выполнять каждый процесс по одному, создавая иллюзию параллелизма. Пример: выполнение нескольких экземпляров программы «Калькулятор». Каждый из экземпляров называется процессом.
Нить:
Поток - это подмножество процесса. Он называется «облегченным процессом», поскольку он похож на реальный процесс, но выполняется в контексте процесса и использует те же ресурсы, которые выделены для процесса ядром. Обычно процесс имеет только один поток управления - один набор машинных инструкций, выполняемых одновременно. Процесс также может состоять из нескольких потоков выполнения, которые выполняют инструкции одновременно. Несколько потоков управления могут использовать истинный параллелизм, возможный в многопроцессорных системах. В однопроцессорной системе применяется алгоритм планирования потоков, и процессор планирует запускать каждый поток по одному. Все потоки, запущенные внутри процесса, имеют одинаковое адресное пространство, дескрипторы файлов, стек и другие атрибуты, связанные с процессом. Поскольку потоки процесса совместно используют одну и ту же память,
ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
источник
С точки зрения интервьюера, есть в основном только 3 основные вещи, которые я хочу услышать, кроме таких очевидных вещей, как процесс может иметь несколько потоков:
Если вы хотите большего, ответ Скотта Лэнгхэма в значительной степени охватывает все. Все это с точки зрения операционной системы. Разные языки могут реализовывать разные концепции, такие как задачи, легковесные потоки и т. Д., Но это всего лишь способы использования потоков (волокон в Windows). Нет аппаратных и программных потоков. Существуют аппаратные и программные исключения и прерывания или пользовательский режим и потоки ядра .
источник
источник
Для тех, кто более удобен в обучении с помощью визуализации, вот удобная диаграмма, которую я создал, чтобы объяснить процессы и потоки.
Я использовал информацию из MSDN - О процессах и потоках
источник
Исходя из мира встраиваемых систем, я хотел бы добавить, что концепция процессов существует только в «больших» процессорах (процессоры для настольных ПК, ARM Cortex A-9 ), которые имеют MMU (модуль управления памятью), и операционных системах, которые поддерживают использование MMU ( такой как Linux ). С небольшими / старыми процессорами и микроконтроллерами и небольшой операционной системой RTOS (операционная система реального времени ), такой как freeRTOS, поддержка MMU отсутствует и, следовательно, нет процессов, а есть только потоки.
Потоки могут получать доступ к памяти друг друга, и они планируются ОС чередующимся образом, поэтому они, кажется, работают параллельно (или с многоядерными процессорами они действительно работают параллельно).
Процессы , с другой стороны, живут в своей собственной изолированной программной среде виртуальной памяти, предоставляемой и защищаемой MMU. Это удобно, потому что позволяет:
источник
источник
Процесс : выполняемая программа называется процессом
Поток : Поток - это функциональность, которая выполняется с другой частью программы на основе концепции «один с другим», поэтому поток является частью процесса.
источник
Я изучил почти все ответы там, увы, будучи студентом, изучающим курс ОС, в настоящее время я не могу полностью понять эти две концепции. Я имею в виду, что большинство парней читают из некоторых книг по ОС различия, то есть потоки имеют доступ к глобальным переменным в единице транзакции, поскольку они используют адресное пространство своего процесса. Тем не менее, вновь возникает вопрос, почему существуют процессы, мы знаем, что потоки являются более легкими по сравнению с процессами. Давайте посмотрим на следующий пример, используя изображение, взятое из одного из предыдущих ответов :
У нас есть 3 темы, работающие одновременно над одним документом, например, Libre Office . Первый выполняет проверку орфографии, подчеркивая, что слово написано с ошибкой. Второй берет и печатает буквы с клавиатуры. И последний действительно сохраняет документ через каждые короткие промежутки времени, чтобы не потерять работающий документ, если что-то пойдет не так. В этом случае 3 потока не могут быть 3 процессами, поскольку они совместно используют общую память, которая является адресным пространством их процесса, и, таким образом, все имеют доступ к редактируемому документу. Итак, дорога - это документ Word вместе с двумя бульдозерами, которые являются нитями, хотя в одном из них отсутствует изображение.
источник
При создании алгоритма в Python (интерпретируемый язык), который включал многопоточность, я был удивлен, увидев, что время выполнения было не лучше, чем по сравнению с последовательным алгоритмом, который я ранее построил. Чтобы понять причину этого результата, я немного прочитал и считаю, что то, что я узнал, предлагает интересный контекст для лучшего понимания различий между многопоточностью и многопроцессорностью.
Многоядерные системы могут осуществлять несколько потоков выполнения, поэтому Python должен поддерживать многопоточность. Но Python - это не скомпилированный язык, а интерпретируемый язык 1 . Это означает, что программа должна быть интерпретирована для запуска, и интерпретатор не знает о программе до того, как она начнет выполняться. Однако он знает правила Python, и затем он динамически применяет эти правила. Оптимизация в Python должна быть главным образом оптимизацией самого интерпретатора, а не кода, который должен быть запущен. Это отличается от скомпилированных языков, таких как C ++, и имеет последствия для многопоточности в Python. В частности, Python использует глобальную блокировку интерпретатора для управления многопоточностью.
С другой стороны, компилируемый язык, ну, в общем, компилируется. Программа обрабатывается «полностью», где сначала она интерпретируется в соответствии с ее синтаксическими определениями, затем отображается в независимое от языка промежуточное представление и, наконец, связывается в исполняемый код. Этот процесс позволяет высоко оптимизировать код, поскольку он все доступен во время компиляции. Различные программные взаимодействия и отношения определяются во время создания исполняемого файла, и могут быть приняты надежные решения по оптимизации.
В современных средах интерпретатор Python должен разрешать многопоточность, и это должно быть безопасным и эффективным. В этом и заключается разница между интерпретируемым языком и компилируемым языком. Интерпретатор не должен мешать внутреннему обмену данными из разных потоков, в то же время оптимизируя использование процессоров для вычислений.
Как было отмечено в предыдущих статьях, и процесс, и поток являются независимыми последовательными выполнениями, при этом основное отличие состоит в том, что память распределяется между несколькими потоками процесса, в то время как процессы изолируют свои области памяти.
В Python данные защищены от одновременного доступа разными потоками с помощью Global Interpreter Lock. Это требует, чтобы в любой программе Python в каждый момент времени мог выполняться только один поток. С другой стороны, можно запускать несколько процессов, поскольку память для каждого процесса изолирована от любого другого процесса, и процессы могут работать на нескольких ядрах.
1 Дональд Кнут имеет хорошее объяснение интерпретирующих процедур в «Искусстве компьютерного программирования: фундаментальные алгоритмы».
источник
Потоки в одном и том же процессе совместно используют память, но каждый поток имеет свой собственный стек и регистры, а потоки хранят специфичные для потока данные в куче. Потоки никогда не выполняются независимо, поэтому взаимодействие между потоками происходит намного быстрее по сравнению с обменом между процессами.
Процессы никогда не разделяют одну и ту же память. Когда дочерний процесс создает, он дублирует область памяти родительского процесса. Связь между процессами осуществляется с использованием канала, разделяемой памяти и анализа сообщений. Переключение контекста между потоками происходит очень медленно.
источник
Лучший ответ, который я нашел до сих пор, это «Интерфейс программирования Linux» Майкла Керриска :
Эта книга является источником большой ясности; Джулия Эванс упомянула свою помощь в разъяснении того, как группы Linux действительно работают в этой статье .
источник
Пример 1: JVM работает в одном процессе, а потоки в JVM совместно используют кучу, принадлежащую этому процессу. Вот почему несколько потоков могут обращаться к одному и тому же объекту. Потоки разделяют кучу и имеют свое собственное пространство стека. Таким образом, вызов одного потока метода и его локальных переменных защищен потоком от других потоков. Но куча не является потокобезопасной и должна быть синхронизирована для безопасности потока.
источник
Они почти одинаковы ... Но ключевое отличие в том, что поток является легковесным, а процесс - тяжелым с точки зрения переключения контекста, рабочей нагрузки и так далее.
источник