有人可以解释一下吗?
i7 处理器可以运行 8 个线程,但我很确定我们可以在 JAVA 或 C++ 程序中创建超过 8 个线程(虽然不确定)。我有一个 i5 处理器,在研究并发性时,我为分配创建了 10 个线程。我只是想了解 CPU 的核心等级与线程的关系。
有人可以解释一下吗?
i7 处理器可以运行 8 个线程,但我很确定我们可以在 JAVA 或 C++ 程序中创建超过 8 个线程(虽然不确定)。我有一个 i5 处理器,在研究并发性时,我为分配创建了 10 个线程。我只是想了解 CPU 的核心等级与线程的关系。
您所指的线程称为软件线程;只要您的操作系统允许,您可以根据需要创建任意数量的软件线程。每个软件线程或代码片段都可以从其他线程同时运行。
对于每个内核,至少有一个 硬件线程,操作系统可以为其分配一个软件线程。例如,如果你有 8 个内核,那么你就有一个容量为 8 的硬件线程池。你可以将数十或数百个软件线程映射到这个 8 槽池,其中实际上只有 8 个线程同时在硬件上运行,即并行。
软件线程就像人们共享同一台计算机。每个人最多可以使用这台计算机一段时间,不一定完成他的任务,然后把它交给另一个。
硬件线程就像每个人都有一台计算机。他们都可以同时进行他们的任务。
注意:对于 i7,每个内核中有两个硬件线程(所谓的超线程)。因此,您最多可以有 16 个线程并行运行。
已经有几个关于硬件方面的好答案,但没有太多关于软件方面的讨论。
我相信您缺少的基本事实是,并非所有线程都必须一直执行。当您在 8 核机器上拥有数千个线程时,在任何给定时间实际上只有少数线程在运行。其他人则无所事事,直到一些处理器时间空闲。这具有巨大的优势,因为线程可能正在等待其他线程资源也是。例如,如果我有一个线程试图从磁盘读取文件,那么它没有理由在等待硬盘数据加载到 RAM 时占用 CPU 时间。另一个例子是当线程正在等待来自其他机器的响应时(例如互联网上的网络请求)。当您的线程数超过处理器一次可以处理的线程数时,操作系统和/或运行时(取决于操作系统和运行时实现。)负责决定哪些线程应该获得可用的处理器时间。这种设置可以让您最大限度地提高机器的生产力,因为 CPU 周期几乎一直在做一些有用的事情。
“线程”是一种软件抽象,它定义了一个单一的、自洽的程序执行路径:在大多数现代系统中,线程的数量基本上只受内存的限制。但是, CPU只能同时运行较少数量的线程。从广义上讲,“核心数”是 CPU 可以真正并行运行的线程数:如果要运行的线程数多于可用的核心数,操作系统将使用某种时间片来让所有的线程有一些时间来执行。
当涉及到“核心”时,有很多术语:
还应该简要提及的是,GPU、图形卡具有巨大的核心数量并并行运行大量(数千个)线程。权衡是 GPU 内核的内存非常少,而且编程模型通常受到很大限制。
不,不,不……您的 I7 有 8 个执行线程,可以同时运行 8 个线程。
1000 个或更多线程可以等待处理器时间。
调用 thread.sleep 将线程从执行核心移出并返回到内存中等待直到唤醒。