哪个操作系统的线程编程足以使用多个内核?

时间:2009-02-03 18:25:17

标签: multithreading operating-system multicore

我想使用我的多线程编程技能(我有技能),但我意识到这还不够。如果操作系统不知道潜在的话,我的线程仍可能竞争相同的核心。我可以在英特尔至强架构上使用哪些OS /编译器/库组合来连接到内核?

8 个答案:

答案 0 :(得分:7)

所有现代操作系统都在所有可用内核上分配线程;但有几种语言或库可以防止这种情况发生。最常见的问题是:

  • 绿色线程。当多个CPU很少且操作系统不够优化时,它曾经具有性能优势。有几个Java虚拟机吹嘘这是一个功能,后来转向M:N方案,我认为现在到处都是N:N。

  • GIL:Global Intepreter Lock。一些脚本语言在解释器循环中有很多全局状态,所以有一个大的(互斥)锁来确保一致性;但这会阻止同一“空间”的两个线程同时运行。至少Python和Lua有这个问题。在这些情况下,最好使用多个进程而不是多个线程。

另外,最好记住大多数cpu绑定应用程序中最大的瓶颈是RAM带宽,通常不是CPU本身,所以有几个线程争用相同的内存可能不是最好的设计。在几个通过小消息进行通信的独立进程中重构通常要好得多。

答案 1 :(得分:4)

在每个操作系统上。这几乎是一个线程的定义。

如果您创建一个启动两个线程的应用程序,那么操作系统可以将它们放在两个独立的核心上。对于Windows,OSX,Linux以及您能想到的任何其他操作系统都是如此。

答案 2 :(得分:1)

由于你“掌握了技能”,我假设你已经知道,如果可用的话,几乎所有现代操作系统都将在多个核心上执行你的线程,并且你的线程没有某种有效的锁定问题使它们成为顺序。

所以我猜你真的在问如何将你的线程绑定到核心,以便它们不会相互竞争。这是通过设置线程的处理器亲和性来完成的。以下是Windows和Linux上有关此文章的链接。我确信其他类型的Unix也存在。我还要注意,这通常不是必需的,因为在某些特殊情况之外,操作系统更清楚地知道在哪里安排线程。请记住,现代操作系统是多进程的,因此您的线程不仅仅是相互竞争,而是与来自框中所有其他进程的线程竞争。根据负载情况,将线程限制为单个核心实际上可能会使它们更快。

http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/core/fnef_mul_dnpl.mspx?mfr=true

http://www.ibm.com/developerworks/linux/library/l-affinity.html

答案 3 :(得分:0)

几乎每个现代操作系统都会在多个核心AFAIK上安排线程。当然,我曾经玩过的Unix的变种没有丝毫问题,而且我很确定所有的Windowses都能很好地处理它。编译器不是问题,因为本机线程是操作系统级别的东西,所以编译器只是向下传递系统调用。

有一些语言(例如Ruby)不使用本机线程,而是使用自己的“绿色”线程,这些线程在解释器中实现,因此看起来像是OS的单个线程,但是它们“这是例外情况,而不是规则,而且在文档中通常会发现正在发生的事情。

答案 4 :(得分:0)

让我们做一个小小的区分。有线程的软件不一定会同时在两个内核上运行。

您需要编写具有同时多线程(SMT)功能的代码。大多数操作系统都会毫无问题地支持这一点 - 唯一真正的区别在于您的软件如何处理锁定和资源。如果您的线程完全依赖于相同的内存或资源,那么就会出现争用和时间点,其中一个或另一个停止等待资源,内存或其他锁定。

大多数具有线程功能的编程语言都能够做到这一点 - 确保它同时运行完全取决于程序员。

您可以在此处找到有关如何使用Visual Studio C ++在Windows中执行此操作的信息:

http://msdn.microsoft.com/en-us/library/172d2hhw.aspx

有很多关于此的教程,特别是对于Windows(C#,C ++,VB等) - 可以通过搜索找到它们:

http://www.google.com/search?q=simultaneous+multithreading+C%2B%2B

- 亚当

答案 5 :(得分:0)

正如其他人所说,任何现代操作系统都会为您做到这一点。但是,它的执行方式会对性能产生很大影响,因此您可能希望以操作系统的方式使用线程。这个Wikipedia article似乎对主要操作系统使用的调度技术有了不错的了解。

答案 6 :(得分:0)

大多数现代操作系统都准备好进行多处理。因此,他们为多核做好准备。但是,调度程序负责将线程分发到核心。 FreeBSD是最有效的多核和多处理操作系统之一。 但是,并非每个操作系统都能够将线程调度到不同的核心。例如,旧的Windows 98不能与多个核心一起使用。此外,许多操作系统对最大内核数量有限制。

我已经阅读了Stackoverflow中的一些帖子,用户正在谈论Packt Publishing的新书,我在Packt Publishing网页上找到了以下文章:

http://www.packtpub.com/article/simplifying-parallelism-complexity-c-sharp

我已经阅读了Joe Duffy的书中的Windows并发编程。现在,我正在等待“C#2008和2005线程编程”,Hillar的书 - http://www.amazon.com/2008-2005-Threaded-Programming-Beginners/dp/1847197108/ref=pd_rhf_p_t_2

答案 7 :(得分:0)

在另一篇文章中,我推荐了一本新书。 如果您正在寻找深刻的答案,我建议您阅读Gaston C. Hillar - Packt Publishing撰写的“C#2008和2005线程编程”的前两章。 在我5天前买这本书之前,我不知道你问题的答案。现在,我能够使用4个并发线程观察我的Core 2 Quad Q6700在C#中达到98%的CPU使用率编程! 它比我想象的容易。如果您拥有多线程知识,那么您将更加轻松。我对同时使用多个内核可以实现的结果印象深刻。我向那些有兴趣开始使用C#的多核或线程编程的人推荐这本书。 我不是C ++程序员。出于这个原因,我需要一本C#beginner的书来使用线程来利用多核。