> For the complete documentation index, see [llms.txt](https://folko.gitbook.io/podgotovka-k-sobesedovaniyu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://folko.gitbook.io/podgotovka-k-sobesedovaniyu/sreda-vypolneniya/processy-potoki-niti.md).

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

### Процессы&#x20;

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

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

### &#x20;Потоки&#x20;

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

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

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

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

### **green threads**&#x20;

&#x20;это [потоки выполнения](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), управление которыми вместо [операционной системы](https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0) производит [виртуальная машина](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%B0) (ВМ). Green threads эмулируют многопоточную среду, не полагаясь на возможности ОС по реализации легковесных потоков. Управление ими происходит в [пользовательском пространстве](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F), а не пространстве [ядра](https://ru.wikipedia.org/wiki/%D0%AF%D0%B4%D1%80%D0%BE_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B), что позволяет им работать в условиях отсутствия поддержки встроенных потоков.[\[1\]](https://ru.wikipedia.org/wiki/Green_threads#cite_note-javaworld-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>
