Multithreading 词语之间的关系:';螺纹';和';核心&x27;

Multithreading 词语之间的关系:';螺纹';和';核心&x27;,multithreading,core,cpu-usage,Multithreading,Core,Cpu Usage,程序创建/可执行的线程数是否与CPU的数量或内核有任何关系/约束?“线程”这个词与CPU的内核有任何关系吗?机器上的内核数是能够同时运行的独立处理单元的数量 程序可以生成的线程数是程序希望彼此并行运行的逻辑执行单元数 通常,程序可以生成的线程数量受语言运行时和操作系统内部线程实现的限制。但是,如果生成的线程数超过机器上的内核数,则并非所有这些线程都可以彼此并行运行。相反,线程将以某种方式进行调度,以尽量延长每个线程的运行时间。线程比内核多是可以的,但是一旦所有内核同时运行线程,引入新线程就不一定

程序创建/可执行的线程数是否与CPU的数量或内核有任何关系/约束?“线程”这个词与CPU的内核有任何关系吗?

机器上的内核数是能够同时运行的独立处理单元的数量

程序可以生成的线程数是程序希望彼此并行运行的逻辑执行单元数

通常,程序可以生成的线程数量受语言运行时和操作系统内部线程实现的限制。但是,如果生成的线程数超过机器上的内核数,则并非所有这些线程都可以彼此并行运行。相反,线程将以某种方式进行调度,以尽量延长每个线程的运行时间。线程比内核多是可以的,但是一旦所有内核同时运行线程,引入新线程就不一定会有多大的加速


在许多情况下,一个程序将有数百个线程,在任何时候都只有一小部分线程在运行。其他线程可能正在休眠并等待某些事件发生(用户输入、计时器、网络或磁盘事件等)。这不是问题;由于这些线程没有主动执行任何操作,因此机器不需要为它们指定任何内核,并且可以将其处理能力用于其他线程。

每个内核可以执行一个线程。如果您有X个内核,那么X个线程可以同时执行。如果您有X个内核和X+n个线程,那么最多X个线程将同时执行。但是,所有线程都将执行,因为操作系统内核将在所有线程之间共享内核。

计算机只能并行运行多个内核线程。如果一个系统只有一个内核,那么一次只能运行一个线程。多任务只能通过在很短的时间内连续运行每个线程来“模拟”

通常操作系统在内核上任意调度线程。例如,一个线程的一个量子可以在一个内核上运行,而同一线程的下一个量子可以在另一个内核上运行。这就是为什么在运行一个cpu密集型线程时,两个内核都很忙。这使得单线程进程可以根据不同的可用性在多个核之间分配负载,从而利用多核系统

更重要的是,操作系统允许在一个或多个内核上“锁定”线程,因此它只在指定的内核上运行。这是在Windows上调用的。今天的多核感知软件可以利用这一点,将某些线程专用于某些内核以优化其工作负载。例如,游戏将人工智能用于一个核心,渲染另一个核心。为了有效地做到这一点,软件必须知道一个系统有多少个内核,并根据这个数量创建和分配线程

类似地,OpenMP等并行编程框架也会对内核进行计数,以有效地并行化操作。它们创建的线程数量与系统上的内核数量相同,以获得物理并行性的最佳性能


我认为这是内核数和线程数之间唯一的关系。

你从来没有学过操作系统101,是吗?我学过,我产生了自己的Unix线程,我编写了自己的线程调度程序,以及所有这些。大多数时候,调度程序不会让你失望。但这不是保证,也不应该被认为是理所当然的。@glowcoder我认为这是线程优先级的时候了。除非有1个以上的线程具有相同的优先级值,否则不会有任何问题。@iamcreasy您分配的任何线程优先级只是对操作系统的建议。为了防止恶意代码试图锁定其他程序,它通常被忽略。引用Joshua Bloch的话,“任何合理的操作系统都会试图公平地做出这一决定,但该策略可能非常有用。因此,编写良好的程序不应该依赖于该策略的细节。任何依赖线程调度程序的正确性或性能的程序都可能无法移植。(重点是作者的)@iamcreasy嗯,这很好,但线程不是这样工作的。你的程序要么是单线程的,要么不是单线程的。毫无疑问,任何时候你都可以将工作负载从需要多线程的环境转移到单线程环境,这就增加了安全性。当你消除对线程运行顺序的依赖时,您大大提高了程序的可靠性,但您不能简单地“将数据注入更宽的总线”“。这不是多线程编程的工作方式。不。但如果您的运行时提供对线程池的支持,这当然很重要。这些日子并不少见。你的问题太模糊了,无法让它成为一个有用的答案。@hans passant什么是线程池?@iamcreasy线程池是指一次生成多个线程,并为每个线程分配特定数量的工作。当它完成后,它会要求经理做更多的工作,等等。这将是非常有用的说。。。web服务器—您不希望每个连接产生一个线程,而是支持最大数量的连接(线程池的大小),并让池在连接到来时拾取连接。如果输入的连接数超过线程数,操作系统将阻止这些连接,直到有一个连接空闲。