一个 C# 线程是一个 CPU 线程吗?
Is one C# thread one CPU thread?
我想知道一个 C# 线程是否用完了一个 CPU 线程,例如:
如果您有一个带有八个线程的 CPU,例如:4790k 并且您启动了两个新的 C# 线程,您会丢失两个线程吗?喜欢 8 - 2 = 6?
线程不是核心。在你给出的情况下,你的计算机有8个核心(4个物理和4个逻辑)可以处理线程。
计算机同时处理数百个线程并在它们之间以极快的速度切换。如果您在 C# 应用程序中创建 Thread
class,它将创建一个新线程,该线程将在 CPU 上的任何内核上执行。您拥有的内核越多,您的计算机运行速度就越快,因为它可以同时处理更多线程(影响计算机速度的还有其他因素,而不仅仅是您拥有多少内核)。
如果我没记错的话,虚拟机 (CLR) 可以自由地做任何它想做的事。例如,有称为绿色线程的实现,不一定将托管线程映射到本机线程。但是,当然,在桌面 x86 上的 .NET 中,我们知道的实现会努力真正映射到系统线程。
现在这是一层,但它仍然没有提到 CPU。 OS 调度程序将让硬件线程(由于超线程而虚拟化)在确定正常时执行本机线程。
有一种叫做过度使用的东西,它指的是当太多本机线程想要 运行(存在于 OS 的调度程序 ready queue
中)时,但是CPU 只有那么多线程可以使用,所以有些线程仍在等待,直到它们的 weight(OS 调度程序的内部度量)决定轮到它们。
您可以查看此文档以获取更多信息:CFS Scheduler
那么关于CLR,可能是这个问题:How does a managed thread work and exist on a native platform?
确实在讨论有用的MSDN页面
Managed and unmanaged threading in Windows
解释说:
An operating-system ThreadId has no fixed relationship to a managed
thread, because an unmanaged host can control the relationship between
managed and unmanaged threads. Specifically, a sophisticated host can
use the Fiber API to schedule many managed threads against the same
operating system thread, or to move a managed thread among different
operating system threads.
出于非常有趣的原因。其中之一当然是虚拟机实现的自由。但另一个是在 native/managed 障碍之间自由通过,具有很大的灵活性,如本页所述。值得注意的是,本机线程可以向后进入托管 application domains ,并看到虚拟机自动分配托管线程对象。这种管理是使用线程 id 哈希来维护的。疯狂的东西:)
实际上,我们可以在页面 CLR Inside Out 上看到 CLR 具有可配置的线程 API 映射。非常灵活,这确实证明您不能肯定地说一个 C# 线程 == 一个本机线程。
与一样,您可以在同一个核心上有多个线程运行。
当您在 .NET 应用程序中生成新线程时,您实际上根本不是在执行多任务。发生的事情是时间切片。您的 CPU 将不断地在不同的线程之间切换,让它们看起来像是在并行工作。但是,一个核心在任何给定时间只能在单个线程上工作。
例如,当实现任务并行库 (TPL) 并且您的机器有多个内核时,您会发现与简单地生成新线程相比,内核获得更均匀分布的工作负载。 Microsoft 确实用 TPL 做了一些很棒的工作来简化多线程异步环境,而不必像我们过去可能必须做的那样对线程池和同步原语进行繁重的工作。
看看这个YouTube video。他很好地描述了时间片与多任务处理。
如果您还不熟悉 TPL,Sacha Barber 有一个精彩的系列赛 on Code Project。
我想知道一个 C# 线程是否用完了一个 CPU 线程,例如:
如果您有一个带有八个线程的 CPU,例如:4790k 并且您启动了两个新的 C# 线程,您会丢失两个线程吗?喜欢 8 - 2 = 6?
线程不是核心。在你给出的情况下,你的计算机有8个核心(4个物理和4个逻辑)可以处理线程。
计算机同时处理数百个线程并在它们之间以极快的速度切换。如果您在 C# 应用程序中创建 Thread
class,它将创建一个新线程,该线程将在 CPU 上的任何内核上执行。您拥有的内核越多,您的计算机运行速度就越快,因为它可以同时处理更多线程(影响计算机速度的还有其他因素,而不仅仅是您拥有多少内核)。
如果我没记错的话,虚拟机 (CLR) 可以自由地做任何它想做的事。例如,有称为绿色线程的实现,不一定将托管线程映射到本机线程。但是,当然,在桌面 x86 上的 .NET 中,我们知道的实现会努力真正映射到系统线程。
现在这是一层,但它仍然没有提到 CPU。 OS 调度程序将让硬件线程(由于超线程而虚拟化)在确定正常时执行本机线程。
有一种叫做过度使用的东西,它指的是当太多本机线程想要 运行(存在于 OS 的调度程序 ready queue
中)时,但是CPU 只有那么多线程可以使用,所以有些线程仍在等待,直到它们的 weight(OS 调度程序的内部度量)决定轮到它们。
您可以查看此文档以获取更多信息:CFS Scheduler
那么关于CLR,可能是这个问题:How does a managed thread work and exist on a native platform?
确实在讨论有用的MSDN页面 Managed and unmanaged threading in Windows 解释说:
An operating-system ThreadId has no fixed relationship to a managed thread, because an unmanaged host can control the relationship between managed and unmanaged threads. Specifically, a sophisticated host can use the Fiber API to schedule many managed threads against the same operating system thread, or to move a managed thread among different operating system threads.
出于非常有趣的原因。其中之一当然是虚拟机实现的自由。但另一个是在 native/managed 障碍之间自由通过,具有很大的灵活性,如本页所述。值得注意的是,本机线程可以向后进入托管 application domains ,并看到虚拟机自动分配托管线程对象。这种管理是使用线程 id 哈希来维护的。疯狂的东西:)
实际上,我们可以在页面 CLR Inside Out 上看到 CLR 具有可配置的线程 API 映射。非常灵活,这确实证明您不能肯定地说一个 C# 线程 == 一个本机线程。
与
当您在 .NET 应用程序中生成新线程时,您实际上根本不是在执行多任务。发生的事情是时间切片。您的 CPU 将不断地在不同的线程之间切换,让它们看起来像是在并行工作。但是,一个核心在任何给定时间只能在单个线程上工作。
例如,当实现任务并行库 (TPL) 并且您的机器有多个内核时,您会发现与简单地生成新线程相比,内核获得更均匀分布的工作负载。 Microsoft 确实用 TPL 做了一些很棒的工作来简化多线程异步环境,而不必像我们过去可能必须做的那样对线程池和同步原语进行繁重的工作。
看看这个YouTube video。他很好地描述了时间片与多任务处理。
如果您还不熟悉 TPL,Sacha Barber 有一个精彩的系列赛 on Code Project。