1

我相信我使用 Thread 类和 Runnable 接口从面向对象的角度对线程有一个合理的理解。在我的一个应用程序中,有一个“下载”按钮,允许用户在后台运行需要大约半小时的任务,同时继续使用 VB.NET 应用程序。

但是,我不明白线程如何映射到计算机的物理体系结构。如果您有一个在具有四核处理器的 PC 上运行的单线程应用程序,那么 .net 程序是否使用所有四个处理器?

如果您在四核处理器上有一个多线程应用程序(比如四个线程),那么每个线程是否在不同的内核上执行?

作为开发人员,您对此有任何控制权吗?

我参考了我在大学读过的一本名为《操作系统概念》的书,但我还没有找到具体的答案。

4

2 回答 2

1

如果您有一个在具有四核处理器的 PC 上运行的单线程应用程序,那么 .net 程序是否使用所有四个处理器?

不,它不能,至少不能同时。但是,从理论上讲,操作系统的调度程序可能首先在一个处理器上执行您的线程,然后再将其移动到另一个处理器。这样的调度程序对于允许同时运行比现有物理处理器更多的应用程序/线程是必要的:线程的执行被切成小块,这些小块一个接一个地馈送到处理器。每个线程都会分配一些时间片,在此期间它可以在 CPU 使用率切换到另一个线程之前进行计算。

作为开发人员,您对此有任何控制权吗?

不是直接的。您可以控制的是线程的优先级,以使其对任务调度程序更重要。

更笼统地说,你不应该你的用例中使用线程——至少不应该直接使用。线程实际上是非常低级的原语。对于您的特定用例,有一个名为的组件为您BackgroundWorker抽象了线程管理的许多低级细节。

如果您在四核处理器上有一个多线程应用程序(比如四个线程),那么每个线程是否在不同的内核上执行?

不必要; 同样,应用程序几乎无法控制其线程的执行方式;然而,操作系统非常努力地“智能”地调度线程。这意味着在实践中,如果您的应用程序有几个繁忙的线程,它们会尽可能均匀地分布在可用内核中。特别是,如果线程数不超过核心数,则每个线程都有自己的核心数。

于 2013-02-16T18:40:57.880 回答
0

通常,您无需担心映射到物理架构,.NET 和操作系统将尽最大努力最大限度地提高应用程序的效率。只需使其成为多线程,即使在单线程计算机上速度较慢。但是,您可以将最大线程数(如果您的应用程序理论上可以扩展到无穷大)限制为内核数,或者将其加倍。测试每种情况的性能,并确定最适合您的最大值。

有时设置一个核心 # 会使您的应用程序的性能更差。例如,如果核心 #1 当前正在扫描您的 PC 以查找病毒,并且您的防病毒软件是单线程的。在上述情况下,假设一台四核 PC,您不想在每核 1 个的基础上运行 4 线程应用程序。

话虽如此,如果你真的想在特定的核心上运行一个线程,这是可能的 - 看到这个:

还要检查一下:

于 2013-02-17T18:18:47.703 回答