- Собеседование на понимание. Процесс, поток, зелёный поток, GIL в Python
- Определения
- Процессы и потоки в Python
- Одноядерные процессоры
- Многоядерные процессоры
- Задачи, привязанные к процессору, и задачи, привязанные к вводу/выводу
- Отличия процесса и потока
- Что нужно запомнить
- Процессы и потоки в Python и чем они отличаются
- Одноядерные процессоры
- Многоядерные процессоры
- Задачи, привязанные к процессору, и задачи, привязанные к вводу/выводу
- Отличия процесса и потока
- Что нужно запомнить
Собеседование на понимание. Процесс, поток, зелёный поток, GIL в Python
Цикл статей «собеседование на понимание» направлен на объяснение простыми словами различных тем. Сегодняшний вопрос на собеседовании backend python: «Расскажите чем отличается поток, процесс, зеленый поток, для чего нужен GIL»
Определения
Выполнение приложения процессором — выполнение инструкций байт кода приложения.
Процесс — выделенная область памяти для выполнения приложения. Запуская приложения мы порождаем процесс. У процесса есть множество свойств и своя структура для управления выполнением приложения.
Поток — часть процесса в которой выполняется приложение. Поток это сущность операционной системы, которая управляется ОС. В языках программирования можно создать и запустить потоки. Но обслуживать их будет ОС. Несколько потоков на одном ядре, работают конкурентно, планировщик их опрашивает и переключает между собой до выполнения. НО при ожидания, например ответа от сети (ввода вывода), другой поток может работать в это время-получается как бы параллельная работа(пока мы ожидаем ответ от сети, ядро может работать, или запустить ещё один запрос в сеть)
Ядро — независимая единица процессора, которая может обслуживать только один поток приложения(два одновременно не может).
Зелёный поток(сопрограмма) — здесь слово поток может путать, т.к. это не поток ОС, а подпрограмма(функция) которая может передать управление другой подпрограмме в момент блокировки ввода вывода. Работают в одном потоке ОС и построены так чтобы использовать время ожидания ввода вывода(сеть, БД, файлы) для выполнения других задач. По сути зелёные потоки работают также как потоки ОС на одном ядре. Если операция процессорная, то профита по времени выполнения не будет. Здесь термин зеленый поток применяется в контексте асинхронности, подходов к реализации которой много(самые популярные: asyncio, gevent).
GIL — блокировщик интерпретатора python. Он блокирует обращение к интерпретатору(процессу cpython который выполняет байт код приложения) из разных потоков ОС. Это простое решение чтобы избежать конфликтов при многопоточности, связано с подсчётом ссылок на объекты приложения. Это историческая особенность интерпретатора cpython.
Процессы и потоки в Python
Представьте, что у нас есть простая программа на Python:
Компьютеры языка Python не знают и не понимают. Они понимают только машинный код — набор инструкций из нуля и единиц.
Поэтому для выполнения программы на Python необходим интерпретатор, который переводит Python-код в машинный код.
Когда вы запускаете какой-нибудь скрипт на Python — например, app.py — интерпретатор Python (CPython) компилирует app.py в машинный код.
Операционная система (ОС) должна загрузить программу в память (RAM), чтобы запустить ее.
Как только ОС загружает программу в память, она по шине перемещает инструкции в центральный процессор для выполнения.
В общем случае ОС перемещает инструкции в очередь, также известную как конвейер. Затем центральный процессор выполняет инструкции из конвейера.
Процесс — это экземпляр программы, выполняемой на компьютере.
Поток — это единица выполнения внутри процесса.
Обратите внимание, что если вы запускаете программу несколько раз, у вас будет одна программа, но несколько процессов, которые являются экземплярами этой программы.
На следующем рисунке показан процесс выполнения программы Python на компьютере:
До сих пор мы в наших статьях разрабатывали программы с одним процессом и одним потоком. В таких ситуациях термины процесс и поток взаимозаменяемы.
У программы может быть один или несколько процессов, а у процесса может быть один или несколько потоков.
Когда у программы несколько процессов, это называется мультпроцессингом. Если у программы несколько потоков, это называется многопоточностью.
Одноядерные процессоры
Раньше у процессоров было только по одному ядру. Это означало, что один процессор одновременно может выполнять только один процесс. Для выполнения нескольких процессов как бы «одновременно» ОС использовала программный компонент — планировщик:
Планировщик похож на переключатель, который управляет планированием процессов. Основная задача планировщика — регулярно выбирать инструкции и отправлять их на выполнение. Планировщик переключается между процессами настолько быстро (около 1 мс), что вам кажется, что компьютер может выполнять несколько процессов одновременно.
Многоядерные процессоры
Сегодня у центрального процессора обычно несколько ядер: например, два ядра (тогда он двухъядерный) или четыре ядра (тогда он четырехъядерный).
Количество ядер определяет количество процессов, которые ЦП может выполнять одновременно. Как правило, чем больше ядер у процессора, тем больше процессов он может выполнять одновременно.
Например, двухъядерный процессор может одновременно выполнять ровно два процесса, а четырехъядерный — не более четырех.
При многопроцессорной обработке используется многоядерный процессор в рамках одного компьютера, который действительно выполняет несколько процессов параллельно.
Задачи, привязанные к процессору, и задачи, привязанные к вводу/выводу
Все программы выполняют два типа задач: связанные с вводом-выводом (I/O-bound) или связанные с процессором (CPU-bound).
- Процессыы, связанные с вводом/выводом, тратят больше времени на ввод/вывод, чем на вычисления. Примеры: сетевые запросы, соединения с базами данных, ввод/вывод файлов.
- Процессы, привязанные к процессору, тратят больше времени на вычисления, чем на запросы ввода-вывода. Примеры: умножение матриц, поиск простых чисел, сжатие видео, потоковое видео.
Технически, многопоточность подходит для процессов, связанных с вводом/выводом, а многопроцессорность — для процессов, связанных с процессором.
Отличия процесса и потока
В следующей таблице показаны основные различия между процессом и потоком:
Критерий сравнения | Процесс | Поток |
Совместное использование памяти | Память не разделяется между процессами | Память разделяется между потоками внутри одного процесса |
Объем потребляемой памяти | Большой | Маленький |
Для каких задач | Задачи, привязанные к процессору | Задачи, привязанные к вводу/выводу |
Время начала работы | Медленнее, чем у потока | Быстрее, чем у процесса |
Прерываемость | Дочерние процессы можно прервать | Потоки нельзя прервать |
Что нужно запомнить
- Процесс — это экземпляр программы, запущенной на компьютере.
- У программы может быть один или несколько процессов.
- Поток — это единица выполнения в процессе.
- У процесса может быть один или несколько потоков.
Процессы и потоки в Python и чем они отличаются
Представьте, что у нас есть простая программа на Python:
Компьютеры языка Python не знают и не понимают. Они понимают только машинный код — набор инструкций из нуля и единиц.
Поэтому для выполнения программы на Python необходим интерпретатор, который переводит Python-код в машинный код.
Когда вы запускаете какой-нибудь скрипт на Python — например, app.py — интерпретатор Python (CPython) компилирует app.py в машинный код.
Операционная система (ОС) должна загрузить программу в память (RAM), чтобы запустить ее.
Как только ОС загружает программу в память, она по шине перемещает инструкции в центральный процессор для выполнения.
В общем случае ОС перемещает инструкции в очередь, также известную как конвейер. Затем центральный процессор выполняет инструкции из конвейера.
Обратите внимание, что если вы запускаете программу несколько раз, у вас будет одна программа, но несколько процессов, которые являются экземплярами этой программы.
На следующем рисунке показан процесс выполнения программы Python на компьютере:
До сих пор мы в наших статьях разрабатывали программы с одним процессом и одним потоком. В таких ситуациях термины процесс и поток взаимозаменяемы.
У программы может быть один или несколько процессов, а у процесса может быть один или несколько потоков.
Когда у программы несколько процессов, это называется мультпроцессингом. Если у программы несколько потоков, это называется многопоточностью.
Одноядерные процессоры
Раньше у процессоров было только по одному ядру. Это означало, что один процессор одновременно может выполнять только один процесс. Для выполнения нескольких процессов как бы «одновременно» ОС использовала программный компонент — планировщик:
Планировщик похож на переключатель, который управляет планированием процессов. Основная задача планировщика — регулярно выбирать инструкции и отправлять их на выполнение. Планировщик переключается между процессами настолько быстро (около 1 мс), что вам кажется, что компьютер может выполнять несколько процессов одновременно.
Многоядерные процессоры
Сегодня у центрального процессора обычно несколько ядер: например, два ядра (тогда он двухъядерный) или четыре ядра (тогда он четырехъядерный).
Количество ядер определяет количество процессов, которые ЦП может выполнять одновременно. Как правило, чем больше ядер у процессора, тем больше процессов он может выполнять одновременно.
Например, двухъядерный процессор может одновременно выполнять ровно два процесса, а четырехъядерный — не более четырех.
При многопроцессорной обработке используется многоядерный процессор в рамках одного компьютера, который действительно выполняет несколько процессов параллельно.
Задачи, привязанные к процессору, и задачи, привязанные к вводу/выводу
Все программы выполняют два типа задач: связанные с вводом-выводом (I/O-bound) или связанные с процессором (CPU-bound).
- Процессыы, связанные с вводом/выводом, тратят больше времени на ввод/вывод, чем на вычисления. Примеры: сетевые запросы, соединения с базами данных, ввод/вывод файлов.
- Процессы, привязанные к процессору, тратят больше времени на вычисления, чем на запросы ввода-вывода. Примеры: умножение матриц, поиск простых чисел, сжатие видео, потоковое видео.
Технически, многопоточность подходит для процессов, связанных с вводом/выводом, а многопроцессорность — для процессов, связанных с процессором.
Отличия процесса и потока
В следующей таблице показаны основные различия между процессом и потоком
Что нужно запомнить
- Процесс — это экземпляр программы, запущенной на компьютере.
- У программы может быть один или несколько процессов.
- Поток — это единица выполнения в процессе.
- У процесса может быть один или несколько потоков.