虚拟机的那个线程是不是需要每个线程有多个实例?
Posted
技术标签:
【中文标题】虚拟机的那个线程是不是需要每个线程有多个实例?【英文标题】:Do VM's that thread require multiple instances for each thread?虚拟机的那个线程是否需要每个线程有多个实例? 【发布时间】:2011-06-20 16:54:10 【问题描述】:我刚刚开始学习 Python,并且听说过 GIL 以及它如何防止“真正的”多线程(我的意思是允许多个线程同时在不同的内核上运行)。
现在,假设要删除的 GIL 不是每个线程(现在在不同的内核上运行)都需要单独的 VM 实例才能执行吗? JVM有同样的问题吗?
如果是这样,在虚拟机上解释/执行的程序中使用线程与单独的进程相比有什么好处(除了使用 POSIX 线程与进程相比的性能提升——尽管我相信在 Linux 中不同之处不在于伟大的)?因为必须为每个线程拥有一个单独的 VM 实例似乎需要很大的开销。
谢谢。
【问题讨论】:
【参考方案1】:不,不需要单独的虚拟机“实例”。为什么会有? GIL 的问题在于它是一种需要在所有线程之间共享的数据结构,并且在没有锁定的情况下不能被多个线程安全地访问。基本上解决方案是尽量避免这种事情:)
许多 VM 会有 一些 每个线程或每个核心的数据结构(例如,一些 JVM 可以从线程本地堆分配内存,从而使分配非常快),但这与每个线程或内核有一个完整的独立 VM 实例。
【讨论】:
感谢您的回复。我认为您需要为每个线程创建一个单独的 VM 实例,以便实际执行在每个线程上运行的 python/java 代码(因为它们不在机器代码中,因此需要由 VM 和多条指令执行同时发生的不能同时在同一个虚拟机上运行) @Arash:嗯,由于更加动态,Python 比 Java 有更多的工作要做。即使 Java 仍然被严格解释,这种解释也可能发生在多个线程上。然而,大多数时候,大多数 Java 代码实际上是运行直接机器码,它是从字节码 JIT 编译的。 因此,执行所有解释的 VM 代码本身可以是多线程的,因此在要由 VM 执行的不同线程中运行的代码由执行实际 VM 的不同线程执行(希望这是有道理的)? @Arash:是的 - 但正如我所说,Java 代码实际上并没有在第一时间得到太多解释。【参考方案2】:GIL 的问题只是粒度问题之一。 GIL 是保护 Python 解释器的所有数据结构的全局锁,解决方案是使用更细粒度的锁来保护这些相同的数据结构。
情况类似于Linux内核BKL(Big Kernel Lock),在2.0中引入了启用SMP。 BKL 已经逐渐被更细粒度的锁所取代,最近终于消失了(2.6.39?)。
【讨论】:
以上是关于虚拟机的那个线程是不是需要每个线程有多个实例?的主要内容,如果未能解决你的问题,请参考以下文章