stringtranslate.com

Bloqueo global del intérprete

Representación esquemática de cómo funcionan los subprocesos en GIL. Verde - hilo que retiene GIL, rojo - hilos bloqueados

Un bloqueo de intérprete global ( GIL ) es un mecanismo utilizado en intérpretes de lenguajes informáticos 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 recuento de referencias ) a la vez. [1] Como regla general, un intérprete que usa GIL verá solo un subproceso para ejecutar a la vez, incluso si se ejecuta en un procesador multinúcleo , aunque algunas implementaciones proporcionan código intensivo de CPU para liberar el GIL, lo que permite múltiples subprocesos. utilizar múltiples 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 mantenido por 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 se pueden diseñar 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 por hilo, lo cual es demasiado costoso en la mayoría de los idiomas [ cita requerida ] .

Desventajas

El uso de un bloqueo de intérprete global en un idioma limita efectivamente la cantidad de paralelismo alcanzable mediante la concurrencia de un único proceso de intérprete con múltiples subprocesos. Si el proceso se compone casi exclusivamente de código interpretado y no realiza llamadas fuera del intérprete que se bloqueen durante largos períodos de tiempo (lo que permite que ese hilo libere el GIL mientras se procesa), es probable que haya muy poco aumento. en velocidad cuando se ejecuta el proceso en una máquina multiprocesador . Debido a la señalización con un subproceso vinculado a la CPU, puede provocar una desaceleración significativa, incluso en procesadores únicos. [2] Lo que es más grave, cuando un único subproceso nativo llama a un proceso de bloqueo del sistema operativo (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érprete 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 lenguaje interpretado sin GIL es Tcl , que se utiliza en la herramienta de evaluación comparativa HammerDB . [6]

Ver también

Referencias

  1. ^ "Bloqueo GlobalInterpreter" . Consultado el 30 de noviembre de 2015 .
  2. ^ David Beazley (11 de junio de 2009). "Dentro de Python GIL" (PDF) . Chicago: Grupo de usuarios de Python de Chicago . Consultado el 7 de octubre de 2009 .
  3. ^ Shannon -jj Behrens (3 de febrero de 2008). "Concurrencia y Python". Diario del Dr. Dobb . pag. 2 . Consultado el 12 de julio de 2008 . El GIL es un candado que se utiliza para proteger todas las secciones críticas en Python. Por lo tanto, incluso si tiene varias CPU, solo un subproceso puede estar haciendo cosas "pythony" a la vez.
  4. ^ "Manual de referencia de la API de Python/C: estado del subproceso y bloqueo global del intérprete". 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". MartilloDB. 2018-11-30 . Consultado el 10 de mayo de 2020 . Es importante comprender desde el principio que HammerDB está escrito en TCL debido a las capacidades únicas de subprocesos que ofrece TCL.