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

редактировать

A глобальная блокировка интерпретатора (GIL ) - это механизм, используемый в интерпретаторах компьютерного языка для синхронизации выполнения потоков, чтобы только один собственный поток мог выполнять за один раз. Интерпретатор, использующий GIL, всегда позволяет выполнять только один поток за раз, даже если он выполняется на многоядерном процессоре. Некоторые популярные интерпретаторы с GIL: CPython и Ruby MRI.

Содержание
  • 1 Базовые технические концепции
  • 2 Недостатки
  • 3 Преимущества
  • 4 Примеры
  • 5 См. Также
  • 6 Ссылки
Основные технические концепции

Глобальная блокировка интерпретатора (GIL) - это взаимное исключение блокировка, удерживаемая язык программирования интерпретатор thread, чтобы избежать совместного использования кода, не потокобезопасного с другими потоками. В реализациях с GIL всегда есть один GIL для каждого интерпретатора процесс.

Приложения, работающие в реализациях с GIL, могут быть разработаны для использования отдельных процессов для достижения полного параллелизма, поскольку каждый процесс имеет свой собственный интерпретатор и, в свою очередь, есть собственный GIL. В противном случае GIL может стать серьезным препятствием для параллелизма.

Недостатки

Использование глобальной блокировки интерпретатора в языке эффективно ограничивает степень параллелизма, достижимую через параллелизм одного процесса интерпретатора с несколькими потоки. Если процесс почти полностью состоит из интерпретируемого кода и не выполняет вызовов вне интерпретатора, которые блокируются на длительные периоды времени (позволяя GIL освобождаться этим потоком во время обработки), вероятно, будет очень небольшое увеличение по скорости при запуске процесса на многопроцессорной машине. Из-за передачи сигналов с потоком, привязанным к процессору, это может вызвать значительное замедление даже на отдельных процессорах.

Преимущества

Причины использования глобальной блокировки интерпретатора включают:

  • повышенная скорость однопоточные программы (нет необходимости приобретать или снимать блокировки для всех структур данных отдельно),
  • простая интеграция C библиотек, которые обычно не являются потокобезопасными,
  • простота реализации (наличие одного GIL намного проще реализовать, чем интерпретатор без блокировок или интерпретатор, использующий мелкозернистые блокировки).

Способ обойти GIL - создать отдельный интерпретатор для каждого потока, что слишком дорого с большинством языков.

Примеры

Некоторые языковые реализации, реализующие глобальную блокировку интерпретатора: CPython, наиболее широко используемая реализация Python и Ruby MRI, эталонная реализация из Ruby (где она называется Global VM Lock). Эквиваленты этих языков на основе

JVM (Jython и JRuby ) не используют глобальные блокировки интерпретатора. IronPython и IronRuby реализованы на основе Microsoft Dynamic Language Runtime и также избегают использования GIL.

Примером интерпретируемого языка, не страдающего от GIL, является Tcl, который используется в инструменте тестирования производительности HammerDB.

См. Также
Ссылки
Последняя правка сделана 2021-05-21 10:53:57
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте