Процессы, потоки,нити

Процессы

Когда инструкции после компиляции передаются в операционную систему, ОС создает процесс и аллоцирует (выделяет) под него адресное пространство, в котором находятся стэк (stack) и куча (heap), присваивает PID (process id) и делает другие важные вещи.

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

Потоки

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

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

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

Мы с вами узнали, что конкурентность —справляться с несколькими задачами одновременно, а параллелизм — выполнять несколько задач одновременно. Задача здесь — это поток. Соответственно, когда несколько задач запускаются в конкурентной или параллельной манере — мы работаем с несколькими потоками. Это называется многопоточностью. Для того чтобы работать с несколькими потоками, ОС занимается планировкой потоков (или thread scheduling). Когда у нас есть несколько потоков, которые работают с одним и тем же участком памяти, у нас может возникать такое явление как race condition (состояние гонки). Это нужно постоянно держать в голове при разработке конкурентных приложений.

green threads

это потоки выполнения, управление которыми вместо операционной системы производит виртуальная машина (ВМ). Green threads эмулируют многопоточную среду, не полагаясь на возможности ОС по реализации легковесных потоков. Управление ими происходит в пользовательском пространстве, а не пространстве ядра, что позволяет им работать в условиях отсутствия поддержки встроенных потоков.[1]

Fiber

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

Coroutine

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

Goroutines

одна из реализаций green threads в языке golang

Ссылки:

https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F

Last updated