【问题标题】:Is multi-threading a property of a language (like java) or a property of OS?多线程是语言(如java)的属性还是操作系统的属性?
【发布时间】:2011-03-03 19:43:28
【问题描述】:

多线程是语言(如 java)的属性还是操作系统的属性?

【问题讨论】:

  • 你为什么要问?简单的答案是两者都是……
  • 线程是平台的属性。对于 Java,Java 也是一个平台(VM)。
  • @codeka:然而,正确的答案是两者都不是。如果设计得当,它是操作系统和/或语言可以利用的硬件设施。但是,如果没有上述硬件支持(即使它只是一个定时器中断),您将不会获得多线程。
  • 你仍然可以在没有显式硬件支持的情况下实现多线程(例如,每n 指令切换上下文),它只是不是一种非常有用的多线程形式(太慢了)。

标签: java multithreading


【解决方案1】:

两者都没有。它是底层硬件的属性。操作系统和语言帮助我们利用硬件提供的功能。

Wiki 可能会有所帮助:http://en.wikipedia.org/wiki/Multithreading

【讨论】:

  • 多线程可以(并且确实)在没有硬件帮助的情况下存在(好吧,只要硬件至少提供定时器中断)
  • 是的。但这取决于硬件。如果没有多线程支持,即使我们使用该语言提供的 API,也不会产生积极的结果。因此,根据 OP 的问题,多线程是硬件的“属性”,而操作系统和 Java(或类似的其他语言)仅提供支持。
  • 作为定时器中断的底层硬件与构建良好的多线程环境所需的工作量相比并不多。
  • 线程和内存模型显然是编程语言语义的一部分。它是如何实现的则是另一回事。
【解决方案2】:

多线程确实依赖于硬件功能,但对于大多数平台来说,“繁重的工作”是由操作系统完成的。这是必不可少的,尤其是对于现代多核系统。该操作系统还提供锁定和监控功能。

话虽如此,有些平台的许多多线程功能,包括调度和锁定,都是在虚拟机而不是操作系统中实现的。这些被称为Green Threads。然而,这些在多核系统中存在局限性,并且正在让位于大多数命令式语言中的本地操作系统线程。

还有其他并发模型可以处理 VM 或运行时中的调度。这些通常在状态不可变的函数式语言中,因此不易受到我们在命令式语言中看到的共享可变状态的锁定问题的影响。我在想ErlangHaskell

【讨论】:

    【解决方案3】:

    补充以上几点,当我们说可以同时运行多少个线程时? 然后它取决于处理器,例如它是双核还是现在的四核。因此每个处理器都有可能同时运行一个线程。因此它是硬件依赖的东西。 希望我的理解是正确的,如果我错了,希望其他成员纠正我。

    【讨论】:

    • 取决于“同时运行”的含义。线程在多核系统之前就已经存在,它们仍然非常有用。
    【解决方案4】:

    最终它是硬件的属性。 Java 从一开始就具有线程功能,但随着 java.util.concurrent 包的引入,这些功能变得更加有用。

    真正的多线程在允许执行多个线程的现代硬件上非常有用。在较旧的硬件上,当使用在等待数据时可能被阻塞的单独线程时,尤其是 I/O 操作更容易理解和控制。

    【讨论】:

      【解决方案5】:

      编程模型必须具有并发性和/或内存模型。例如,Java 有线程和这个memory model(维基百科中的概述)。这显然属于编程语言的语义,它的规范。

      其他编程语言可能有其他并发抽象(想想 clojure 与代理等)或其他内存模型。内存模型越简单,语言使用起来就越简单。反过来,复杂的内存模型使得并发很难正确处理(想想 Java 中volatile 的定义)。所以有些人认为编程语言不应该有内存模型。

      并发和/或内存模型的实际实现取决于语言的实现者。您可以使用OS 进程/线程,或者VM 可以模拟线程(所谓的green thread)。甚至还有其他方法可以拥有超轻线程,例如Kilim

      但是,要真正利用多核,您必须使用操作系统线程(每个核心一个),否则就没有硬件并行性。但是程序使用的“逻辑”线程可以在 N 个 OS 线程上以轻量级方式调度。据我所知,无法告诉 JVM 使用多少 OS 线程来调度绿色线程。如果有人有这方面的指针,那会很有趣。

      总结:多线程是一个逻辑概念。应用程序可以是多线程的,但可以在一个内核上运行。多核并行是一个硬件概念。为了利用多核并行性,VM 必须实现线程化,以便使用 OS 进程,这些进程将在不同的内核上运行。

      编辑

      实际上,Java 线程和内存模型现在在专用规范JSR-133 中进行了描述,而不是 Java 语言规范的第 17 章。更多信息JSR-133 FAQ

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 2019-03-13
        • 1970-01-01
        • 2015-10-13
        • 2013-06-06
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多