Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中,一个应用程序的CPU内核数和线程数之间的关系是什么?_Java_Multithreading_Sockets_Networking - Fatal编程技术网

在java中,一个应用程序的CPU内核数和线程数之间的关系是什么?

在java中,一个应用程序的CPU内核数和线程数之间的关系是什么?,java,multithreading,sockets,networking,Java,Multithreading,Sockets,Networking,我是java多线程编程新手。我想到的问题是,根据我的CPU内核的数量,我可以运行多少线程。如果我运行的线程数超过CPU核数,那么机器运行应用程序的开销会很大。例如,当我们有一台服务器机器,它有一个运行两个线程(主线程+开发人员线程)的服务器软件时,当更多的并发客户机与服务器进行套接字连接时,是否会增加服务器的开销 谢谢。这取决于线程在做什么。CPU一次只能做X件事情,其中X是它拥有的核心数。这意味着在任何时候最多可以有X个线程处于活动状态,但是其他线程可以等待轮到它们,CPU将在适当的时候处理它

我是java多线程编程新手。我想到的问题是,根据我的CPU内核的数量,我可以运行多少线程。如果我运行的线程数超过CPU核数,那么机器运行应用程序的开销会很大。例如,当我们有一台服务器机器,它有一个运行两个线程(主线程+开发人员线程)的服务器软件时,当更多的并发客户机与服务器进行套接字连接时,是否会增加服务器的开销


谢谢。

这取决于线程在做什么。CPU一次只能做X件事情,其中X是它拥有的核心数。这意味着在任何时候最多可以有X个线程处于活动状态,但是其他线程可以等待轮到它们,CPU将在适当的时候处理它们


你也应该考虑很多时间线程等待响应,或者等待数据加载,或者网络消息到达,等等,所以实际上并没有做任何事情。这些空闲/等待线程在系统上的负载非常小。

线程少于CPU可能意味着您没有使用系统中的所有CPU。如果CPU是您的瓶颈,那么拥有更多线程可能会提高吞吐量


拥有比CPU更多的线程确实会带来开销,如果CPU是您的瓶颈,这可能会影响性能。然而,如果网络IO是您的瓶颈,那么这个开销是值得付出的代价,因为它通常允许您处理更多的连接。e、 g.您可以有1000个TCP连接和它们自己的线程。

当内核数(NOC)等于线程数(NOT)时,性能最佳,因为如果不是NOC,处理器应该切换上下文,否则操作系统将尝试执行该操作,这是非常昂贵的操作。但您必须了解,在Web服务器上不可能有NOC=NOT,因为您无法预测同时会有多少客户端。看看这个概念,以最好的方式解决这个问题。

不要担心线程数量会比CPU内核数量多;这实际上不在您的手中,而是在操作系统中

假设JVM将java线程映射到操作系统线程上(这在当今相当正常),这取决于操作系统的线程管理。在这里,您依赖于内核实现的智能程度来获得内核的性能

你必须记住的是,你的设计必须是可持续的。例如,应用程序服务器构建在充满工作线程的线程池上。这些线程被唤醒以服务请求。您希望每个请求都有一个线程吗?那么您肯定会遇到一个问题——请求可能会成千上万地到达服务器,这可能是内核管理的一个问题。实际上,线程池的大小应该是有限的(在1到X之间,即使在实时情况下也很容易更改),线程应该从并发队列中获得工作(java为此提供了一些优秀的类),并且每个线程都按顺序处理请求


我希望能有所帮助,一个系统可以同时执行的线程数(当然)与系统中的内核数相同

系统上可以存在的线程数量受可用内存的限制(每个线程都需要一个堆栈和操作系统用来管理线程的结构),并且操作系统允许的线程数量可能也有限制(这取决于操作系统的体系结构,一些操作系统可能使用固定大小的表,一旦表满,就不能再创建线程)

通常,今天的计算机可以处理数百到数千个线程


系统中使用的线程多于内核的原因是:大多数线程不可避免地会花费大量时间等待某个事件(例如:字处理器等待用户在键盘上键入)。操作系统管理它,使以这种方式等待的线程不会占用CPU时间。

其背后的思想是不要让您的CPU休眠,也不要加载太多,以免浪费线程切换的大部分时间

检查

背后的想法是,这取决于任务的性质,如果它的所有内存计算任务都可以使用N+1个线程(N个内核(包括超线程))


我们需要进行应用程序分析,找出典型请求的等待时间(WT)、服务时间(ST)以及大约N*(1+WT/ST)考虑到CPU的100%利用率,我们可以拥有的最佳线程数。

不必有任何关系。计算机可以有任意数量的内核;进程可以有任意数量的线程

进程利用线程有几个不同的原因,包括:

  • 编程抽象。划分工作并将每个部分分配给一个执行单元(线程)使用这种方法的编程模式包括反应器、线程连接和线程池模式。然而,有些人将线程看作是反模式。不可模仿的Alan Cox总结了这一点:“线程是针对不能编程状态机的人。”

  • 阻塞I/O。如果没有线程,阻塞I/O会停止整个进程。这可能对吞吐量和延迟都有害。在多线程进程中,单个线程可能会阻塞,等待I/O,而其他线程则会前进。因此,通过线程阻塞I/O是异步和非阻塞I/O的替代方法。

  • 节省内存。线程提供了一种有效的方式来共享内存,同时利用多个执行单元。通过这种方式,线程可以替代多个进程

  • 并行性。在具有多个处理器的机器中,threa