Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多线程是一种语言(如java)的属性还是操作系统的属性?_Java_Multithreading - Fatal编程技术网

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

多线程是一种语言(如java)的属性还是操作系统的属性?,java,multithreading,Java,Multithreading,多线程是一种语言(如java)的属性还是操作系统的属性?两者都不是。它是底层硬件的属性。操作系统和语言帮助我们利用硬件提供的功能 Wiki可能会有所帮助:多线程确实依赖于硬件功能,但对于大多数平台来说,“繁重的工作”是由操作系统完成的。这一点至关重要,尤其是在现代多核系统中。操作系统还提供锁定和监视功能 话虽如此,已经有很多平台在虚拟机而不是操作系统中实现了许多多线程功能,包括调度和锁定。这些被称为。然而,这些在多核系统中有局限性,在大多数命令式语言中,它们正在让位给本机OS线程 还有其他并发模

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

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


Wiki可能会有所帮助:

多线程确实依赖于硬件功能,但对于大多数平台来说,“繁重的工作”是由操作系统完成的。这一点至关重要,尤其是在现代多核系统中。操作系统还提供锁定和监视功能

话虽如此,已经有很多平台在虚拟机而不是操作系统中实现了许多多线程功能,包括调度和锁定。这些被称为。然而,这些在多核系统中有局限性,在大多数命令式语言中,它们正在让位给本机OS线程


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

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

归根结底,这是硬件的财产。Java从一开始就具有线程功能,但随着Java.util.concurrent包的引入,这些功能变得更加可用


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

编程模型必须具有并发性和/或内存模型。例如,Java有线程和这个(wikipedia中的概述)。这显然属于编程语言及其规范的语义

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

并发和/或内存模型的实际实现取决于语言的实现者。您可以使用操作系统进程/线程,或者虚拟机可以模拟线程(所谓的)。例如,甚至还有其他方法可以使用超轻线程

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

总之:多线程是一个逻辑概念。应用程序可以是多线程的,但可以在一个核心上运行。多核并行是一个硬件概念。为了利用多内核并行性,VM必须实现线程,以便使用操作系统进程,该进程将在不同的内核上运行

编辑


实际上,Java线程和内存模型现在是在一个专用规范中描述的,而不是Java语言规范的第17章。更多关于

的信息,您为什么要问?简单的答案是,这两者都是…线程是平台的一个属性。就Java而言,Java也是一个平台(VM)。@codeka:然而,正确的答案是两者都不是。如果设计得当,操作系统和/或语言可以利用这一硬件设施。但是,如果没有上述硬件支持,(即使只是一个计时器中断),也无法实现多线程。如果没有明确的硬件支持(例如,每个
n
指令切换上下文),仍然可以实现多线程,这将不是一种非常有用的多线程形式(速度太慢)。多线程可以(和确实存在)不需要硬件的帮助(当然,只要硬件至少提供一个定时器中断)是的。但这取决于硬件。如果没有多线程支持,即使我们使用该语言提供的API,也不会有积极的结果。因此,根据OP的问题,多线程是一个“属性”操作系统和Java(或类似的其他语言)提供了对硬件的支持。作为计时器中断的底层硬件与创建良好的多线程环境所需的工作量相比并不多。线程和内存模型显然是编程语言语义的一部分。如何实现则是另一回事。取决于“同时运行”的含义。线程是在多核系统出现之前,它们仍然非常有用。