Un bloqueo de intérprete global ( GIL ) es un mecanismo utilizado en intérpretes de lenguaje de computadora para sincronizar la ejecución de subprocesos de modo que solo un subproceso nativo (por proceso) pueda ejecutar operaciones básicas (como asignación de memoria y conteo de referencias ) a la vez. [1] Como regla general, un intérprete que utiliza GIL verá solo un subproceso para ejecutar a la vez, incluso si se ejecuta en un procesador multinúcleo , aunque algunas implementaciones prevén código intensivo de CPU para liberar el GIL, lo que permite que varios subprocesos utilicen varios núcleos. Algunos intérpretes populares que tienen GIL son CPython y Ruby MRI .
Un bloqueo de intérprete global (GIL) es un bloqueo de exclusión mutua que mantiene un subproceso de intérprete de lenguaje de programación para evitar compartir código que no es seguro para subprocesos con otros subprocesos. En implementaciones con un GIL, siempre hay un GIL para cada proceso de intérprete .
Las aplicaciones que se ejecutan en implementaciones con un GIL pueden diseñarse para utilizar procesos separados para lograr un paralelismo total, ya que cada proceso tiene su propio intérprete y, a su vez, tiene su propio GIL. De lo contrario, el GIL puede ser una barrera importante para el paralelismo.
Las razones para emplear un bloqueo de intérprete global incluyen:
Una forma de evitar un GIL es crear un intérprete separado para cada hilo, lo que resulta demasiado costoso en la mayoría de los lenguajes. [ cita requerida ]
El uso de un bloqueo de intérprete global en un lenguaje limita efectivamente la cantidad de paralelismo alcanzable a través de la concurrencia de un único proceso de intérprete con múltiples subprocesos. Si el proceso está compuesto casi exclusivamente de código interpretado y no realiza llamadas fuera del intérprete que se bloquean durante largos períodos de tiempo (lo que permite que ese subproceso libere el GIL mientras procesa), es probable que haya muy poco aumento en la velocidad al ejecutar el proceso en una máquina multiprocesador . Debido a la señalización con un subproceso limitado por la CPU, puede causar una desaceleración significativa, incluso en procesadores individuales. [2] Más grave aún, cuando el único subproceso nativo llama a un proceso del sistema operativo que bloquea (como el acceso al disco), todo el proceso se bloquea, aunque otros subprocesos de la aplicación puedan estar esperando.
Algunas implementaciones de lenguaje que implementan un bloqueo de intérprete global son CPython , la implementación más utilizada de Python , [3] [4] y Ruby MRI , la implementación de referencia de Ruby (donde se llama Global VM Lock).
Los equivalentes de estos lenguajes basados en JVM ( Jython y JRuby ) no utilizan bloqueos de intérpretes globales. IronPython y IronRuby se implementan sobre Dynamic Language Runtime de Microsoft y también evitan el uso de un GIL. [5]
Un ejemplo de un lenguaje interpretado sin un GIL es Tcl , que se utiliza en la herramienta de evaluación comparativa HammerDB . [6]
El GIL es un bloqueo que se utiliza para proteger todas las secciones críticas de Python. Por lo tanto, incluso si tiene varias CPU, es posible que solo un hilo esté haciendo cosas "de Python" a la vez.
IronPython no tiene GIL y el código multiproceso puede utilizar procesadores multinúcleo.
Es importante entender desde el principio que HammerDB está escrito en TCL debido a las capacidades únicas de subprocesamiento que aporta TCL.