线程(在Java或C ++程序中)与CPU中的内核数之间有什么关系?

时间:2013-08-16 01:48:49

标签: multithreading cpu multicore

有人可以对此有所了解吗?

i7处理器可以运行8个线程,但我很确定我们可以在JAVA或C ++程序中创建超过8个线程(但不确定)。我有一个i5处理器,在研究并发时,我创建了10个线程进行分配。我只是想了解CPU的核心评级与线程的关系。

5 个答案:

答案 0 :(得分:8)

您所引用的主题称为软件主题;只要您的操作系统允许,您就可以根据需要创建任意数量的软件线程。每个软件线程或代码段都可以与其他人一起运行

对于每个核心,至少有一个 硬件线程,操作系统可以为其分配软件线程。例如,如果你有8个内核,那么你有一个容量为8的硬件线程池。你可以将数十或数百个软件线程映射到这个8插槽池,其中只有8个线程实际上同时在硬件上运行,即 并行

软件线程就像人们共享同一台计算机一样。每个人都可以使用这台计算机一段时间,不一定完成任务,然后将其交给另一个人。

硬件线程就像每个人都有一台计算机的人。所有人都可以同时完成任务。

注意:对于i7,每个核心都有two hardware threads(所谓的超线程)。因此,您最多可以并行运行16个线程。

答案 1 :(得分:2)

已经有一些很好的答案谈论硬件方面的事情,但没有太多关于软件方面的讨论。

我相信你缺少的一个重要事实是并非所有线程都必须一直执行。当你在8核机器上有数千个线程时,其中只有少数线程实际上在任何给定时间运行。其他人在一些处理器时间变得空闲之前无所事事。这具有巨大的优势,因为线程可能也在等待其他资源。例如,如果我有一个线程试图从磁盘读取文件,那么它没有理由在等待硬盘数据加载到RAM时占用CPU时间。另一个例子是线程正在等待来自其他某台机器的响应(例如通过互联网的Web请求)。当您拥有的线程数超过处理器可以同时处理的数量时,操作系统和/或运行时(取决于操作系统和运行时实现)将负责决定哪些线程应该获得可用的处理器时间。这种设置可以让您最大限度地提高机器的生产率,因为CPU周期几乎一直在做有用的事情。

答案 2 :(得分:1)

“线程”是一种软件抽象,它通过程序定义单个,自洽的执行路径:在大多数现代系统中,线程数基本上仅受内存的限制。但是,只有相对较少数量的线程可以由CPU同时运行。从广义上讲,“核心数”是CPU可以并行运行的线程数:如果有更多线程要运行而不是有可用内核,操作系统将使用某种时间切片让所有线程有一些时间来执行。

当涉及到“核心:”

时,有很多术语被抛出
  • 处理器数量:系统主板上的物理CPU芯片数量。在具有多个核心的CPU可用之前,这曾经是唯一重要的数字。
  • 逻辑核心数:系统硬件可以并行运行的线程数
  • 物理核心数:系统具有的CPU执行硬件的副本数 - 由于功能的原因,这并不总是等于逻辑核心数像SMT(“同步多线程”),它使用单个硬件来并行运行多个线程
  • 模块计数:最近(Bulldozer派生的)AMD处理器使用的架构是SMT与标准的one-logical-core-per-physical-core模型之间的混合体。在这些CPU上,每个逻辑内核都有一个单独的整数执行硬件副本,但是两个逻辑内核共享一个浮点单元和fetch-and-decode前端; AMD将包含两个逻辑核心的单元称为模块

还应该简单地提到GPU,图形卡具有巨大的核心数量并且并行运行大量(数千)线程。需要权衡的是,GPU核心的内存非常少,而且通常是一种基本上受限制的编程模型。

答案 3 :(得分:0)

线程由OS的调度程序处理。 CPU中的核心数决定了可以同时运行的线程数

请注意,调度程序会不断地切换线程,以便让所有内容同时运行的“错觉”。

更多here,如果您有兴趣的话。

答案 4 :(得分:0)

不,不,不...你的I7有8个执行线程,可以同时运行8个线程。

1000个或更多线程可以等待处理器时间。

调用thread.sleep会将一个线程从执行核心移出并返回到内存中等待直到被唤醒。