为什么Java虚拟机中没有GIL?为什么Python需要这么糟糕?

Age*_*uid 174 python java multithreading jvm gil

我希望有人可以提供一些见解,了解Java虚拟机的根本不同之处在于它允许它在不需要全局解释器锁(GIL)的情况下很好地实现线程,而Python则需要这样的恶意.

Ale*_*lli 219

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

空载燕子项目,其它的宏伟目标中,做计划一个GIL -免费的虚拟机为Python -引用该网站,"此外,我们打算移除GIL和修复在Python多线程的状态,我们认为,这是通过实施更复杂的GC系统,例如IBM的Recycler(Bacon等,2001).

  • Unladen Swallow团队已放弃删除GIL:http://code.google.com/p/unladen-swallow/wiki/ProjectPlan#Global_Interpreter_Lock (79认同)
  • 是Bartosz,Greg Stein在1999年做过测量.通过引用计数的垃圾收集是杀手,迫使细粒度锁定的巨大开销.这就是为什么更高级的GC在那里至关重要的原因. (10认同)
  • 亚历克斯,那些旧的移除GIL的尝试怎么样呢?是不是有大量的开销(我记得2倍)? (6认同)

Gre*_*yer 49

JVM(至少是热点)确实具有与"GIL"类似的概念,它的锁粒度更加精细,其中大部分来自GC中的更高级的热点.

在CPython中,它是一个很大的锁(可能不是那么真实,但足以说明问题),在JVM中,它根据使用的位置更多地传播不同的概念.

例如,在热点代码中查看vm/runtime/safepoint.hpp,这实际上是一个障碍.一旦处于安全点,整个VM就java代码而停止,就像python VM在GIL停止一样.

在Java世界中,这种VM暂停事件被称为"停止世界",在这些点上,只有绑定到某些标准的本机代码才能自由运行,其余的VM已经停止.

此外,java中缺少粗略锁定使得JNI编写起来要困难得多,因为JVM对其FFI调用环境的保证较少,cpython之所以相当容易(尽管不像使用ctypes那么容易).


小智 6

在这篇博客文章http://www.grouplens.org/node/244中有一篇评论,暗示为什么它很容易为IronPython或Jython免除GIL,这是CPython使用引用计数而其他2个虚拟机都有垃圾收集器.

我为什么会这样做的确切机制,但这听起来似乎是一个合理的理由.

  • 当你在线程之间混杂地共享对象时,当没有人对某个特定对象有引用时,解决这个问题会让你感到尴尬.使用全局锁定进行引用计数是一种(昂贵的)方式.解决它的另一种方法是一次只允许一个线程持有对象的引用,这将使大多数活动成为线程本地,代价是使线程间通信更加尴尬.就个人而言,我认为它告诉HPC使用处理器之间的消息传递而不是共享内存,并且出于可伸缩性的原因这样做... (4认同)