ter*_*789 8 linux central-processing-unit multi-threading concurrency parallel-computing
这是机器规格:
CPU(s): 20
Thread(s) per core: 1
Core(s) per socket: 10
Socket(s): 2
Run Code Online (Sandbox Code Playgroud)
根据我到目前为止所读到的内容,这些数字意味着我可以运行 20 个并行作业,因为我有 20 个 CPU。
但是,每个 CPU 中可以运行多少个线程?
tel*_*coM 10
欢迎来到服务器故障!
您有两个 CPU 插槽,即两个物理处理器。每个处理器有 10 个核心,每个核心基本上相当于一个经典的单核 CPU。每个核心一次只能运行 1 个线程,即禁用超线程。
因此,最多可以并行执行 20 个线程,每个 CPU/核心一个线程。这可能意味着 20 个单线程作业、1 个具有 20 个线程的多线程作业或介于两者之间的任何作业。
但这仅适用于预计始终 100% 忙碌的线程,几乎在其生命周期中的每一毫秒。如果您的线程要花费大量时间等待其他事情发生,系统将在您的线程等待时自动运行其他线程。
除非您处于针对数字运算进行了高度优化的环境中,否则您不会在 100% 的时间内获得所有这 20 个线程:操作系统的后台进程(守护进程)将占用其中的一些线程在某些(一小部分)时间里。ps -ef在任何现代类 UNIX 系统空闲时运行(或同等系统):您将看到超过 20 个进程,每个进程至少包含一个线程,而这仅适用于操作系统本身。
假设您将通过准确分配硬件可用的线程数来充分利用系统,这可能过于简化了优化问题。根据您正在执行的操作,您可能需要使用更多或更少的线程。例如,如果您正在规划本质上受 CPU 限制的繁重计算作业,则通过为作业分配略少于 20 个的线程实际上可能会获得更好的结果,以便一两个 CPU 核心仍可用于操作系统的后台任务,这样你的工作线程就会更少被中断。
但如果你正在搭建J2EE服务器环境,JVM通常会拥有大量的线程,而且其中大多数线程的大部分生命都在等待输入,因此J2EE服务器的JVM上使用的线程总数20 个 CPU 的系统很容易远远高于 20 个。