4

有人可以解释一下吗?

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

4

5 回答 5

10

您所指的线程称为软件线程;只要您的操作系统允许,您可以根据需要创建任意数量的软件线程。每个软件线程或代码片段都可以从其他线程同时运行。

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

软件线程就像人们共享同一台计算机。每个人最多可以使用这台计算机一段时间,不一定完成他的任务,然后把它交给另一个。

硬件线程就像每个人都有一台计算机。他们都可以同时进行他们的任务。

注意:对于 i7,每个内核中有两个硬件线程(所谓的超线程)。因此,您最多可以有 16 个线程并行运行。

于 2013-08-16T02:33:58.933 回答
2

已经有几个关于硬件方面的好答案,但没有太多关于软件方面的讨论。

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

于 2013-08-16T03:31:53.790 回答
1

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

当涉及到“核心”时,有很多术语:

  • 处理器数量:系统主板上物理 CPU 芯片的数量。在多核 CPU 可用之前,这曾经是唯一重要的数字。
  • 逻辑核心数:系统硬件可以并行运行的线程数
  • 物理核心数:系统拥有的 CPU 执行硬件的副本数——这并不总是等于逻辑核心数,因为SMT(“同时多线程”)等功能使用单个硬件来运行多个线程并行
  • 模块数量:最近(推土机衍生的)AMD 处理器使用的架构是 SMT 和标准的一个逻辑核心每物理核心模型之间的混合体。在这些 CPU 上,每个逻辑核心都有一个单独的整数执行硬件副本,但两个逻辑核心共享一个浮点单元和读取和解码前端;AMD 将包含两个逻辑核心的单元称为模块

还应该简要提及的是,GPU、图形卡具有巨大的核心数量并并行运行大量(数千个)线程。权衡是 GPU 内核的内存非常少,而且编程模型通常受到很大限制。

于 2013-08-16T02:39:50.457 回答
0

线程由操作系统的调度程序处理。CPU 中的内核数量决定了它可以同时运行多少线程。

请注意,调度程序会不断地切换线程,以提供所有东西都在同时运行的“错觉”。

更多在这里,如果你有兴趣。

于 2013-08-16T01:55:12.213 回答
0

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

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

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

于 2013-08-16T02:38:23.133 回答