那么这是否意味着我的CPU可以同时执行四个不同的指令?每个线程是否能够是多线程?
简而言之,是的。
由于某些因素,如流水线等,CPU每个时钟周期只能执行1个单独的指令,但由于流水线,CPU可能能够在单个时钟周期内通过不同阶段传递多个指令,并且时钟频率可能非常快,但仍然只有1条指令。
例如,NOP是x86汇编指令,CPU将其解释为“本周期不进行操作”,这是从甚至简单如以下代码中执行的数百或数千条(及更多)指令之一:
int main(void)
{
while (1) { }
return 0;
}
一个
CPU 执行线程 是指正在执行一系列指令(指令线程),不管这些指令来自哪个应用程序,CPU 都不知道高级概念(如应用程序),这是操作系统的功能。
因此,如果你有一台具有 2(或 4/8/128 等)个共享相同内存(缓存/RAM)的 CPU 的计算机,则可以拥有 2(或多个)个 CPU 可以在(字面上)完全相同的时间运行 2(或多个)个指令。请记住,这些是同时运行的机器指令(即软件的物理方面)。
一个
操作系统级线程 有点不同。虽然 CPU 处理执行的物理方面,但操作系统处理逻辑方面。上述代码分解为多个指令,并且在执行时,在多个 CPU 上实际运行(在多 CPU 感知的环境中),即使它是单个 "线程"(在操作系统级别),操作系统也会安排何时运行下一个指令以及在哪个 CPU 上运行(基于操作系统的线程调度策略,在各种操作系统之间是不同的)。因此,上述代码将占用该 CPU 上给定 "时间片段" 的 100% CPU 使用率。
这种 "时间" 的 "切片"(也称为
抢占式计算)是操作系统可以同时运行多个应用程序的原因,它并不是字面上的同一时间,因为 CPU 一次只能处理 1 条指令,但对于一个人来说(谁几乎无法理解 1 秒钟的长度),它似乎是 "同时的"。
当运行应用程序时,内核(操作系统)实际上会生成一个单独的线程(内核线程)来运行该应用程序,此外,该应用程序可以请求创建另一个外部线程(即生成另一个进程或分叉),或通过调用操作系统的(或编程语言的)API 创建一个内部线程,其实际上调用较低级别的内核例程来生成和维护生成的线程的上下文切换,此外,任何已创建的线程也可以调用相同的 API 来生成其他单独的线程(因此,线程能够是 "多线程的")。
多线程(在应用程序和操作系统的意义上)并不一定可移植,因此,虽然您可能学习Java或C#并使用它们的API(即
Thread.Start
或
Runnable
),但实际使用操作系统提供的API(即
CreateThread
或
pthread_create
和大量其他并发函数)会为设计决策打开不同的门(例如:“平台X是否支持线程库Y”),这是需要牢记的一点,当您探索不同的API时。
我希望这能帮助增加一些清晰度。