В чем разница между процессом и потоком и какова их иерархия?
Что проверяют
Понимаете ли вы, что процессы изолированы, а потоки делят память, и знаете ли, что из этого следует в Python.
Как отвечать
Процесс это выполняющаяся программа со своим адресным пространством, дескрипторами и правами. Операционная система изолирует процессы: упавший не роняет остальных, а обмен данными идёт через явные средства (каналы, сокеты, разделяемая память).
Поток это единица исполнения внутри процесса. У потока свой стек и регистры, но куча, дескрипторы и глобальные переменные общие со всеми потоками процесса. Создание дешевле, переключение быстрее, обмен данными мгновенный, но именно из-за общей памяти появляются гонки и нужна синхронизация.
Иерархия: система запускает процессы, процесс содержит один и более потоков, планировщик ядра распределяет потоки по ядрам.
Для Python важно добавить главное следствие. GIL разрешает исполнять байт-код только одному потоку одновременно, поэтому потоки ускоряют программу, которая ждёт сеть или диск, и почти не ускоряют вычисления. Для вычислений берут multiprocessing: у каждого процесса свой интерпретатор и свой GIL, зато данные надо сериализовать при передаче.
Полезно упомянуть, что GIL отпускается на операциях ввода-вывода и внутри C-расширений вроде NumPy, поэтому «потоки в Python бесполезны» это неверное упрощение.
Где спотыкаются
Говорят, что у потока своя память.
Считают, что GIL делает потоки бессмысленными для любых задач.
Не упоминают стоимость обмена данными между процессами.
Не знают, что процесс всегда содержит хотя бы один поток, и противопоставляют их как равные сущности.