我相信使用Thread类和Runnable接口可以从面向对象的角度理解线程。在我的一个应用程序中,有一个“下载”按钮,允许用户在后台运行一个大约半小时的任务,同时继续使用VB.NET应用程序。
但是,我不明白Threading如何映射到计算机的物理架构。如果您的单线程应用程序在具有四核处理器的PC上运行,那么.net程序是否使用所有四个处理器?
如果在四核处理器上有多线程应用程序(比如四个线程),那么每个线程是否在不同的内核上执行?
作为开发人员,您对此有何控制权?
我引用了一本我在大学读过的一本名为“操作系统概念”的书,但我没有找到具体的答案。
答案 0 :(得分:1)
如果您的单线程应用程序在带有四核处理器的PC上运行,那么.net程序是否使用所有四个处理器?
不,它不能,至少不能同时。但是,理论上可能operating system’s scheduler首先在一个处理器上执行您的线程,然后将其移动到另一个处理器。这样的调度程序对于允许同时运行比存在的物理处理器更多的应用程序/线程是必要的:线程的执行被切成小块,一个接一个地馈送到处理器。每个线程获得一些时间片分配,在此期间,它可以在CPU使用之前计算到另一个线程。
作为开发人员,您对此有何控制权?
不直接。您可以控制的是您的线程的优先级,使其对任务调度程序更重要。
更一般地说,你应该不在你的用例中使用线程 - 至少不是直接的。线程实际上是非常低级的原语。对于您的特定用例,有一个名为BackgroundWorker
的组件,它为您提取了许多线程管理的低级细节。
如果在四核处理器上有多线程应用程序(比如四个线程),那么每个线程是否在不同的内核上执行?
不一定;再一次,应用程序几乎无法控制其线程的执行方式;然而,操作系统非常难以“巧妙地”安排线程。这意味着在实践中,如果您的应用程序有多个繁忙的线程,它们将尽可能均匀地分布在可用的核心上。特别是,如果没有比核心更多的线程,那么每个线程都有自己的核心。
答案 1 :(得分:0)
通常,您不必担心映射到物理体系结构,.NET和操作系统将尽最大努力提高应用程序的效率。只需将其设置为多线程,即使以单线程计算机上的速度较慢为代价。但是,您可以将最大线程数(如果您的应用理论上扩展到无穷大)限制为多个核心,或者将其加倍。测试每种情况的性能,并确定哪种最大值最适合您。
有时设置核心#会让您的应用程序性能更差。例如,如果核心#1当前正在扫描您的PC以查找病毒,并且您的防病毒软件是单线程的。在上述场景中,假设使用四核PC,您不希望以每核1为基础运行4线程应用程序。
话虽如此,如果你真的想在特定的核心上运行一个线程,那么就有可能 - 看看:
同时检查一下: