stringtranslate.com

Bloqueo de intérprete global

Representación esquemática de cómo funcionan los subprocesos en GIL. Verde: subproceso que contiene GIL, rojo: subprocesos bloqueados

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 .

Conceptos técnicos básicos

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.

Ventajas

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 ]

Desventajas

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.

Ejemplos

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]

Véase también

Referencias

  1. ^ "GlobalInterpreterLock" . Consultado el 30 de noviembre de 2015 .
  2. ^ David Beazley (11 de junio de 2009). "Inside the Python GIL" (PDF) . Chicago: Chicago Python User Group . Consultado el 7 de octubre de 2009 .
  3. ^ Shannon -jj Behrens (3 de febrero de 2008). "Concurrencia y Python". Diario del Dr. Dobb . p. 2. Consultado el 12 de julio de 2008. 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.
  4. ^ "Manual de referencia de la API de Python/C: estado del subproceso y bloqueo del intérprete global". Archivado desde el original el 14 de septiembre de 2008. Consultado el 15 de agosto de 2014 .
  5. ^ "IronPython en python.org". python.org . Consultado el 4 de abril de 2011. IronPython no tiene GIL y el código multiproceso puede utilizar procesadores multinúcleo.
  6. ^ "Conceptos y arquitectura de HammerDB". HammerDB. 2018-11-30 . Consultado el 2020-05-10 . Es importante entender desde el principio que HammerDB está escrito en TCL debido a las capacidades únicas de subprocesamiento que aporta TCL.