在 Java 中,应用中的 CPU 内核数和线程数之间的关系是什么?
2022-09-03 04:59:48
我是Java多线程编程的新手。我想到的问题是,根据我的CPU内核数量,我可以运行多少个线程。如果我运行的线程超过CPU内核,那么机器运行应用程序是否会产生开销,例如,当我们的服务器机器具有运行2个线程(主线程+开发人员线程)的服务器软件时,当更多并发客户端与服务器建立套接字连接时,是否会成为服务器的开销?
谢谢。
我是Java多线程编程的新手。我想到的问题是,根据我的CPU内核数量,我可以运行多少个线程。如果我运行的线程超过CPU内核,那么机器运行应用程序是否会产生开销,例如,当我们的服务器机器具有运行2个线程(主线程+开发人员线程)的服务器软件时,当更多并发客户端与服务器建立套接字连接时,是否会成为服务器的开销?
谢谢。
系统可以同时执行的线程数(当然)与系统中的内核数相同。
系统上可以存在的线程数受到可用内存的限制(每个线程都需要一个堆栈和操作系统用来管理线程的结构),并且可能存在操作系统允许的线程数的限制(这取决于操作系统体系结构,某些操作系统可能使用固定大小的表,一旦其完整,就无法创建更多的线程)。
通常,今天的计算机可以处理数百到数千个线程。
系统中使用的线程比内核多的原因是:大多数线程将不可避免地花费大量时间等待某些事件(例如:字处理器等待用户在键盘上键入)。操作系统管理它,以这种方式等待的线程不会消耗CPU时间。
它背后的想法是不要让你的CPU进入睡眠状态,也不要加载太多,以至于它在线程切换中浪费了大部分时间。
在 IBM 论文中检查调整池大小很有帮助
背后的想法是,这取决于任务的性质,如果它的所有内存计算任务,你可以使用N + 1线程(N个内核(包括超线程))。
或
我们需要进行应用程序分析,并找出典型请求的等待时间(WT),服务时间(ST)以及大约N *(1 + WT / ST)个最佳线程数,考虑到100%的CPU利用率。