web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de GIL dans la machine virtuelle Java? Pourquoi pourquoi Python en a-t-il besoin si mal?)

J'espère que quelqu'un pourra donner un aperçu de ce qui est fondamentalement différent à propos de la machine virtuelle Java qui lui permet d'implémenter correctement les threads sans avoir besoin d'un verrou d'interpréteur global (GIL), tandis que Python nécessite un tel mal.

173
AgentLiquid

Python (le langage) n'a pas besoin d'un GIL (c'est pourquoi il peut parfaitement être implémenté sur JVM [Jython] et .NET [IronPython], et ces implémentations sont multithread librement). CPython (l'implémentation populaire) a toujours utilisé un GIL pour faciliter le codage (en particulier le codage des mécanismes de récupération de place) et l'intégration de bibliothèques codées C non thread-safe (il y en avait une tonne de ceux qui étaient autour; -).

Le projet Hirondelle à vide , parmi d'autres objectifs ambitieux, prévoit un GIL sans machine virtuelle pour Python - pour citer ce site, "De plus, nous avons l'intention de supprimer le GIL et de corriger l'état du multithreading en Python. Nous pensons que cela est possible grâce à l'implémentation de un système GC plus sophistiqué, quelque chose comme IBM's Recycler (Bacon et al, 2001). "

219
Alex Martelli

La JVM (au moins hotspot) a un concept similaire au "GIL", elle est juste beaucoup plus fine dans sa granularité de verrouillage, la plupart de cela vient des GC dans hotspot qui sont plus avancés.

En CPython, c'est un gros verrou (probablement pas vrai, mais assez bon pour les arguments), dans la JVM, il est plus répandu avec différents concepts selon l'endroit où il est utilisé.

Jetez un œil, par exemple, à vm/runtime/safepoint.hpp dans le code du hotspot, qui est effectivement une barrière. Une fois à un point de sécurité, l'ensemble VM s'est arrêté en ce qui concerne Java code, un peu comme le python VM s'arrête au GIL.

Dans le monde Java tel que VM les événements de pause sont appelés "stop-the-world"), à ces points, seul le code natif lié à certains critères est libre, le reste de la VM a été arrêté.

De plus, l'absence d'un verrou grossier dans Java rend JNI beaucoup plus difficile à écrire, car la JVM offre moins de garanties sur son environnement pour les appels FFI, l'une des choses que cpython rend assez facile (bien que pas aussi simple que d'utiliser des ctypes).

48
Greg Bowyer

Il y a un commentaire ci-dessous dans ce billet de blog http://www.grouplens.org/node/244 qui indique la raison pour laquelle il était si facile de se passer d'un GIL pour IronPython ou Jython, il est que CPython utilise le comptage de références tandis que les 2 autres VM ont des récupérateurs de place.

La mécanique exacte de la raison pour laquelle je ne comprends pas, mais cela semble être une raison plausible.

6
user235859

Dans ce lien ils ont l'explication suivante:

... "Certaines parties de l'interpréteur ne sont pas threadsafe, mais principalement parce que les rendre toutes threadsafe par une utilisation massive des verrous ralentirait extrêmement le thread unique ( source ). Cela semble être lié aux ordures CPython collecteur utilisant le comptage de références (la JVM et le CLR n'ont pas, et donc n'ont pas besoin de verrouiller/libérer un compte de références à chaque fois). Mais même si quelqu'un pensait à une solution acceptable et l'implémentait, les bibliothèques tierces auraient toujours le mêmes problèmes. "

0
Oliver Wilken