我刚刚开始学习Python,并且已经听说过GIL以及它如何阻止“真正的”多线程(我的意思是,允许多个线程同时在不同的内核上运行)。
现在,假设要删除的GIL是不是每个线程(现在在不同的核心上运行)都需要一个单独的VM实例才能执行? JVM是否有同样的问题?
如果是这样,在VM上解释/执行的程序中使用线程与单独的进程相比是否有任何好处(除了使用POSIX线程与进程的性能提升之外 - 尽管我相信Linux的区别不是那个大)?因为每个线程必须有一个单独的VM实例,所以开销似乎很多。
感谢。
答案 0 :(得分:2)
不,不需要VM的单独“实例”。为什么会这样? GIL的问题在于它是一个需要在所有线程之间共享的数据结构,并且在没有锁定的情况下无法由多个线程安全地访问。基本上解决方案是尽量避免这种事情:)
许多虚拟机将具有某些每线程或每核数据结构(例如,某些JVM可以从线程本地堆分配内存,使得分配非常快)但是这不同于每个线程或核心一个完整的独立VM实例。
答案 1 :(得分:2)
GIL的问题只是粒度问题之一。 GIL是一个全局锁,它保护Python解释器的所有数据结构,解决方案是使用更精细的锁来保护这些相同的数据结构。
这种情况类似于Linux内核BKL(大内核锁),它在2.0中引入以启用SMP。 BKL已逐渐被更精细的锁定取代,最近终于消失了(2.6.39?)。