Глобальная блокировка переводчика
Глобальная блокировка интерпретатора ( GIL ) — это механизм, используемый в интерпретаторах компьютерного языка для синхронизации выполнения потоков , чтобы только один собственный поток (на каждый процесс) мог выполнять базовые операции (такие как выделение памяти и подсчет ссылок ). одновременно [1] Как правило, интерпретатор, использующий GIL, видит только один поток для выполнения одновременно, даже если он работает на многоядерном процессоре , хотя некоторые реализации предусматривают использование кода, интенсивно использующего процессор, для освобождения GIL, что позволяет нескольким потокам использовать несколько потоков. ядра. Некоторые популярные интерпретаторы, поддерживающие GIL, — это CPython и Ruby MRI .
Концепции технической подготовки
[ редактировать ]Глобальная блокировка интерпретатора (GIL) — это взаимного исключения, блокировка удерживаемая потоком программирования, языка интерпретатора чтобы избежать совместного использования кода, который не является потокобезопасным, с другими потоками. В реализациях с GIL всегда существует один GIL для каждого процесса интерпретатора .
Приложения, работающие в реализациях с GIL, могут быть спроектированы так, чтобы использовать отдельные процессы для достижения полного параллелизма, поскольку каждый процесс имеет свой собственный интерпретатор и, в свою очередь, имеет свой собственный GIL. В противном случае GIL может стать существенным препятствием для параллелизма.
Преимущества
[ редактировать ]Причины использования глобальной блокировки интерпретатора включают в себя:
- повышенная скорость работы однопоточных программ (нет необходимости устанавливать или снимать блокировки на все структуры данных отдельно),
- простая интеграция библиотек C , которые обычно не являются потокобезопасными,
- простота реализации (гораздо проще реализовать один GIL, чем интерпретатор без блокировок или интерпретатор, использующий детальные блокировки).
Способ обойти GIL — создать отдельный интерпретатор для каждого потока, что для большинства языков слишком дорого. [ нужна ссылка ]
Недостатки
[ редактировать ]Использование глобальной блокировки интерпретатора в языке эффективно ограничивает степень параллелизма, достижимого за счет одновременного выполнения одного процесса интерпретатора с несколькими потоками. Если процесс почти полностью состоит из интерпретируемого кода и не выполняет вызовы за пределами интерпретатора, которые блокируются на длительные периоды времени (что позволяет этому потоку освободить GIL во время обработки), увеличение, скорее всего, будет очень небольшим. по скорости при запуске процесса на многопроцессорной машине. Из-за передачи сигналов с потоком, привязанным к ЦП, это может привести к значительному замедлению работы даже на одном процессоре. [2] Более серьезно, когда один собственный поток вызывает блокирующий процесс ОС (например, доступ к диску), весь процесс блокируется, даже если другие потоки приложений могут ожидать.
Примеры
[ редактировать ]Некоторыми языковыми реализациями, реализующими глобальную блокировку интерпретатора, являются CPython , наиболее широко используемая реализация Python , [3] [4] и Ruby MRI , эталонная реализация Ruby . (где она называется Global VM Lock)
JVM Эквиваленты этих языков на основе ( Jython и JRuby ) не используют глобальные блокировки интерпретатора. IronPython и IronRuby реализованы поверх Microsoft Dynamic Language Runtime и также не используют GIL. [5]
Примером интерпретируемого языка без GIL является Tcl , который используется в инструменте сравнительного анализа HammerDB . [6]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «ГлобалИнтерпретерЛокк» . Проверено 30 ноября 2015 г.
- ^ Дэвид Бизли (11 июня 2009 г.). «Внутри Python GIL» (PDF) . Чикаго: Группа пользователей Python в Чикаго . Проверено 7 октября 2009 г.
- ^ Шеннон - Джей Беренс (3 февраля 2008 г.). «Параллелизм и Python» . Журнал доктора Добба . п. 2 . Проверено 12 июля 2008 г.
GIL — это замок, который используется для защиты всех критических разделов Python. Следовательно, даже если у вас несколько процессоров, только один поток может одновременно выполнять действия «pythony».
- ^ «Справочное руководство по API Python/C: состояние потока и глобальная блокировка интерпретатора» . Архивировано из оригинала 14 сентября 2008 г. Проверено 15 августа 2014 г.
- ^ «IronPython на python.org» . python.org . Проверено 4 апреля 2011 г.
IronPython не имеет GIL, и многопоточный код может использовать многоядерные процессоры.
- ^ «Концепции и архитектура HammerDB» . ХаммерДБ. 30 ноября 2018 г. Проверено 10 мая 2020 г.
С самого начала важно понимать, что HammerDB написан на TCL из-за уникальных возможностей многопоточности, которые предоставляет TCL.