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

Что такое программы, процессы и потоки?

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

Программа

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

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

Процесс

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

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

Нить

Поток — это наименьшая единица выполнения внутри процесса. В процессе может быть несколько потоков.

Итак, давайте сделаем краткий обзор.

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

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

Поток — это наименьшая единица выполнения внутри процесса. Один процесс может иметь несколько потоков.

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

Определение

Мы уже рассмотрели это в разделе «Что» выше.

Время создания/прекращения

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

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

Дополнительный вопрос:
Есть ли случай, когда время создания процесса совпадает со временем создания потока?

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

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

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

Дополнительный вопрос №2:
Правда ли, что создание процесса в Windows обходится дороже, чем в Linux?

Коммуникация и обмен данными

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

Процесс является изолированным исполняемым объектом и не использует совместно данные и информацию. Процессы используют для связи механизм IPC (Inter-Process Communication), что значительно увеличивает количество системных вызовов.

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

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

Переключение контекста

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

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

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

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

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

Горутина против потока?

Поддержка языка программирования Go Goroutine. В чем разница между горутиной и потоком?

Поток имеет большой размер стека (> 1 МБ), если мы планируем иметь тысячи потоков, накладные расходы на размер стека будут потреблять много памяти.

Горутины называются облегченными потоками, управляемыми Go Runtime Scheduler, они существуют в виртуальном пространстве среды выполнения Go, а не в операционной системе. Чтобы сделать стек меньше, среда выполнения Go использует ограниченные стеки изменяемого размера, которые изначально занимают всего 2 КБ на горутин. Несколько горутин могут выполняться в одном потоке.

Стоимость создания Goroutine ничтожно мала по сравнению с потоком. Обычно в приложении Go одновременно работают тысячи горутин.

Дополнительный вопрос:
Некоторые языки программирования поддерживают сопрограммы. В чем разница между сопрограммой, горутиной и потоком?

Заключение

В этой статье мы вместе рассмотрели очень фундаментальный термин в вычислительной технике, который называется «Процесс» и «Поток». Мы узнали, что это такое, в чем и почему существуют различия между Process и Thread. Затем мы пойдем дальше и поговорим о Goroutine языка программирования Go.

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

Рекомендации

Спасибо, что прочитали эту статью! Оставьте комментарий, если у вас есть какие-либо вопросы или отзывы. Если вы нашли эту статью полезной, пожалуйста, удерживайте кнопку хлопка, чтобы другие могли найти это. Обязательно подпишитесь на мою рассылку ниже или подпишитесь на меня на Medium, чтобы получать больше подобных статей. ☝️👏 🤗