Jump to content

Глобальная блокировка переводчика

Схематическое изображение того, как потоки работают в GIL. Зеленый — поток, удерживающий GIL, красный — потоки заблокированы.

Глобальная блокировка интерпретатора ( 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]

См. также

[ редактировать ]
  1. ^ «ГлобалИнтерпретерЛокк» . Проверено 30 ноября 2015 г.
  2. ^ Дэвид Бизли (11 июня 2009 г.). «Внутри Python GIL» (PDF) . Чикаго: Группа пользователей Python в Чикаго . Проверено 7 октября 2009 г.
  3. ^ Шеннон - Джей Беренс (3 февраля 2008 г.). «Параллелизм и Python» . Журнал доктора Добба . п. 2 . Проверено 12 июля 2008 г. GIL — это замок, который используется для защиты всех критических разделов Python. Следовательно, даже если у вас несколько процессоров, только один поток может одновременно выполнять действия «pythony».
  4. ^ «Справочное руководство по API Python/C: состояние потока и глобальная блокировка интерпретатора» . Архивировано из оригинала 14 сентября 2008 г. Проверено 15 августа 2014 г.
  5. ^ «IronPython на python.org» . python.org . Проверено 4 апреля 2011 г. IronPython не имеет GIL, и многопоточный код может использовать многоядерные процессоры.
  6. ^ «Концепции и архитектура HammerDB» . ХаммерДБ. 30 ноября 2018 г. Проверено 10 мая 2020 г. С самого начала важно понимать, что HammerDB написан на TCL из-за уникальных возможностей многопоточности, которые предоставляет TCL.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8121bcdae3a4e2fe0596b0e5c6eb3dd4__1721072580
URL1:https://arc.ask3.ru/arc/aa/81/d4/8121bcdae3a4e2fe0596b0e5c6eb3dd4.html
Заголовок, (Title) документа по адресу, URL1:
Global interpreter lock - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)