假设我运行了一个创建四个.NET线程的程序。每个线程运行大约需要45分钟(作为单线程应用程序自行运行)。
假设我可以访问带有四核处理器的服务器。所有四个线程都能在45分钟内完成吗?
我今天从一本书中做了一些阅读,其中说在多线程方面没有理所当然。这本书似乎暗示在我的例子中有一天可能需要45分钟,因为所有四个核心都是并行使用的。但是,在另一天,该计划可能需要三个小时(4 * 45)才能完成。
更新 这个问题的目的是澄清我读过的一点。我的书暗示我的程序(创建四个线程并且每天运行一次)可以在第1天使用四个核心,在第x天使用一个核心。我想知道我是否理解这一点。我测试了程序10次,每次使用所有四个核心。因此,我可以假设将始终使用所有四个核心吗?
答案 0 :(得分:2)
这本书是正确的,因为在一些典型的多线程程序中,很多因素可能会导致它在某些或所有情况下变慢。例如,不小心使用锁定是一个很好的选择,使程序永远不会比单核更快,而且通常要慢很多。或者,像过度频繁的上下文切换一样微妙的东西可能会导致所有内核的大量缓存污染,随之而来的是减速。基本上,如果没有详细查看代码(最好是测试它),你就是不知道。
这也不是Windows内核调度程序的错误,因为根据我的知识,Linux,Hurd,Mach等在这项工作上并没有明显更好。您可以设计不会遇到某些问题的系统,但通常以二进制兼容性为代价,并且通常也会兼容源代码。因此,这些努力通常仅限于研究操作系统。
编辑:this presentation by Ciaran McHale中给出了缓存污染和互斥调度程序公平性的更详细示例。