程序创建/使用的线程数是否与CPU具有的数量或核心有任何关系/约束?单词thread
是否与Cores of CPU
有任何关系?
答案 0 :(得分:5)
计算机只能并行运行number_of_cores线程。如果系统只有一个核心,则只能同时运行一个线程。通过在非常短的时间内连续运行每个线程来“模拟”多任务处理。
通常,操作系统会在核心上任意调度线程。例如,线程的一个量子可以在一个核心上运行,同一个线程的下一个量子可以在另一个核心上运行。这就是为什么当你运行单个cpu-heavy线程时你看到两个内核都很忙的原因。这允许单线程进程通过在多个内核之间分配负载来利用多核系统,具体取决于不同的可用性。
更重要的是,操作系统允许线程在一个或多个核心上“锁定”,因此它仅在指定的核心上运行。这在Windows上称为affinity mask。今天的多核感知软件可以利用这一点,并将某些线程专用于某些内核以优化其工作负载。游戏用于将AI专用于一个核心,例如渲染另一个核心。为了有效地执行此操作,软件必须知道系统具有多少核心,并根据该数量创建和分配线程。
类似,并行编程框架(如OpenMP)会对核心进行计数,从而有效地并行化操作。它们创建与系统上的核心数一样多的线程,以获得物理并行性的最佳性能。
我认为这是核心数量与线程数量之间关系的唯一情况。
答案 1 :(得分:2)
计算机上核心的数量是能够同时运行的独立处理单元的数量。
程序可以产生的线程的数量是程序希望彼此并行运行的逻辑执行单元的数量。
通常,程序可以生成的线程数受语言运行时和操作系统内部线程实现的限制。但是,如果您生成的线程数多于计算机上的核心数,则并非所有这些线程都可以彼此并行运行。相反,将以某种方式调度线程以尝试最大化每个线程运行的时间量。拥有比核心更多的线程是好的,但是当所有核心同时运行线程时,通过引入新线程,你不一定会获得更多的加速。
在许多情况下,一个程序将有数百个线程,其中只有少数会在任何时候运行。其他线程可能正在休眠并等待某些事件发生(用户输入,计时器,网络或磁盘事件等)。这不是问题;由于这些线程没有主动执行任何操作,因此机器不需要将任何内核专用于它们,并且可以将其处理能力用于其他线程。
答案 2 :(得分:1)
每个核心都可以执行一个线程。如果你有X核,那么X线程可以同时执行。如果你有X核和X + n个线程,那么最多X个线程将同时执行。但是,所有线程都将执行,因为操作系统内核将在所有线程之间共享内核。