Как работают процессы и потоки в контексте операционных систем?
Что проверяют
Понимаете ли вы, что процесс это единица изоляции, а поток единица планирования, и знаете ли, что происходит при переключении.
Как отвечать
Процесс это выполняющаяся программа со своим виртуальным адресным пространством, таблицей дескрипторов, правами. Изоляция обеспечивается аппаратно через блок управления памятью: один процесс не может обратиться к памяти другого. Обмен данными идёт явно: каналы, сокеты, разделяемая память.
Поток это единица планирования внутри процесса. У него свой стек, регистры и счётчик команд, но куча, код и дескрипторы общие со всеми потоками процесса.
Переключение стоит разного: между потоками одного процесса меняются регистры и указатель стека; между процессами дополнительно переключается адресное пространство, что сбрасывает буфер трансляции адресов и потому заметно дороже.
Что стоит добавить как признак понимания:
- состояния потока: готов, выполняется, заблокирован. Планировщик вытесняет по кванту времени и по приоритету;
- память процесса делится на сегменты: код, статические данные, куча (растёт вверх), стек каждого потока (растёт вниз);
- создание процесса в Unix это
forkс копированием при записи, поэтому оно дешевле, чем кажется; - зомби и сироты: завершившийся процесс остаётся в таблице, пока родитель не заберёт код возврата.
Практический вывод для Go: горутина это не поток. Рантайм мультиплексирует тысячи горутин на несколько потоков операционной системы, поэтому переключение между ними не требует перехода в ядро.
Где спотыкаются
Говорят, что у потока своя память.
Не могут объяснить, почему переключение процессов дороже.
Путают параллелизм и конкурентность.
Не знают, что создание процесса использует копирование при записи.