2011-06-20 58 views
0

我刚刚开始学习Python并听说过GIL以及它如何防止“真正的”多线程(我的意思是允许多个线程同时在不同的内核上运行)。虚拟机的线程是否需要每个线程有多个实例?

现在,假设是GIL被删除不会每个线程(现在运行在不同的核心)需要一个单独的VM实例来执行? JVM是否有同样的问题?

如果是这样,在VM上解释/执行的程序中使用线程vs单独进程(除了使用POSIX线程vs进程的性能增益之外,还有什么好处 - 尽管我相信Linux的差别不在于那很棒)?因为必须为每个线程拥有一个单独的虚拟机实例,这似乎是一个很大的开销。

谢谢。

回答

2

不,不需要VM的单独“实例”。为什么会有? GIL的问题在于它是一种数据结构,需要在所有线程之间共享,并且不能被多线程安全地访问而不锁定。基本上解决的办法是尽量避免这种事情:)

许多VM都会一些每线程或每内核数据结构(例如一些JVM可以从一个线程本地堆分配内存,使得分配非常快),但这不同于每个线程或核心的整个独立VM实例。

+0

感谢您的回复。我认为你需要为每个线程分别创建一个VM实例,以便实际执行每个线程上运行的python/java代码(因为它们不在机器代码中,因此需要由VM和多条指令执行同时发生的无法同时运行在同一个虚拟机上) –

+0

@Arash:嗯,由于更具动态性,Python比Java更有工作要做。即使Java仍然严格解释,解释可能发生在多个线程上。但是,大多数情况下,大多数Java代码实际上*都是直接运行的机器代码,它是从字节代码进行JIT编译的。 –

+0

因此,执行所有解释的VM代码本身可以是多线程的,因此运行在由VM执行的不同线程中的代码正由执行实际VM的不同线程执行(希望这有意义)? –

2

GIL的问题只是粒度之一。 GIL是一个全局锁,可以保护Python解释器的所有数据结构,解决方案是使用更细粒度的锁来保护这些相同的数据结构。

这种情况与在2.0中引入的启用SMP的Linux内核BKL(大内核锁)类似。 BKL已经逐渐被更细密的锁取代,并且最近终于消失(2.6.39?)。

相关问题