为什么 Java 虚拟机中没有 GIL?为什么Python需要一个如此糟糕的?

2022-08-31 06:33:28

我希望有人能提供一些关于Java虚拟机的根本不同之处的见解,允许它很好地实现线程,而不需要全局解释器锁(GIL),而Python需要这样的邪恶。


答案 1

Python(语言)不需要GIL(这就是为什么它可以完美地在JVM [Jython]和.NET [IronPython]上实现,并且这些实现可以自由地多线程)。CPython(流行的实现)一直使用GIL来简化编码(特别是垃圾收集机制的编码)和非线程安全的C编码库的集成(过去有很多这样的库;-)。

Unladen Swallow项目,以及其他雄心勃勃的目标,确实为Python计划了一个无GIL的虚拟机 - 引用该网站的话,“此外,我们打算删除GIL并修复Python中多线程的状态。我们相信,通过实施更复杂的GC系统,就像IBM的Recloocker(Bacon et al, 2001)一样,这是可能的。


答案 2

JVM(至少是热点)确实与“GIL”有类似的概念,只是它的锁定粒度要精细得多,其中大部分来自GC在热点中更高级。

在CPython中,它是一个大锁(可能不是那么真实,但对于参数来说已经足够好了),在JVM中,它更多地传播不同的概念,这取决于它在哪里使用。

例如,看看热点代码中的vm/runtime/safepoint.hpp,这实际上是一个障碍。一旦到达安全点,整个虚拟机就停止了Java代码,就像python虚拟机停止在GIL上一样。

在Java世界中,这种VM暂停事件被称为“停止世界”,在这些点上,只有绑定到某些条件的本机代码才能自由运行,VM的其余部分已被停止。

此外,Java中缺乏粗略的锁定使得JNI更难编写,因为JVM对其FFI调用环境的保证较少,这是cpython相当容易的事情之一(尽管不像使用ctypes那么容易)。