7 вопросов
Фундамент операционных систем: процессы, потоки, виртуальная память, переключение контекста, deadlock. Понимание различий между конкурентностью и параллелизмом критически важно для Go-разработчика.
Процесс имеет собственное адресное пространство - изолирован от других. Потоки одного процесса разделяют память, файловые дескрипторы и другие ресурсы. Создание потока дешевле, чем процесса. Но разделяемая память требует синхронизации.
Подробнее →При переключении контекста ОС сохраняет регистры, стек и состояние текущего потока, затем загружает состояние другого. Это дорогая операция (тысячи тактов CPU). Горутины Go значительно дешевле в переключении, чем потоки ОС.
Подробнее →Конкурентность - возможность работать с несколькими задачами (не обязательно одновременно). Параллелизм - буквально одновременное выполнение на разных ядрах. Конкурентный код может работать на одном ядре. Параллелизм требует нескольких ядер.
Подробнее →Виртуальная память - абстракция ОС, которая даёт каждому процессу иллюзию собственного непрерывного адресного пространства. Маппинг виртуальных адресов на физические выполняет MMU. Swap - один из механизмов виртуальной памяти.
Подробнее →Мьютекс - бинарная блокировка: только один поток может владеть ресурсом. Семафор - счётчик: допускает до N одновременных потоков. В Go мьютекс - sync.Mutex, семафор можно реализовать через буферизованный канал: make(chan struct{}, N).
Подробнее →Go использует M:N модель: M горутин мультиплексируются на N потоков ОС. Планировщик Go (GMP: Goroutine, Machine, Processor) распределяет горутины по потокам. Это даёт лёгкость горутин и настоящий параллелизм на нескольких ядрах.
Подробнее →Deadlock возникает при одновременном выполнении 4 условий Коффмана: 1) mutual exclusion - эксклюзивный доступ; 2) hold and wait - удержание ресурса при ожидании другого; 3) no preemption - ресурс нельзя отобрать; 4) circular wait - циклическое ожидание.
Подробнее →