2009-02-03 71 views
2

我想用我的多线程编程技巧(我有技能),但我意识到这还不够。如果操作系统没有意识到潜力,我的线程可能仍然会争夺同一个内核。我可以在Intel Xeon架构上使用什么操作系统/编译器/库组合来连接到内核?哪个操作系统的线程编程足以利用多个内核?

+0

所有,但特别的Solaris线程爱。 – 2009-02-03 19:21:11

回答

4

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

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

0

几乎每个现代操作系统都会在多个内核中安排线程,AFAIK。当然,我曾经玩过的任何Unix的变种都没有丝毫问题,我相当肯定所有的Window都能很好地处理它。编译器不是问题,因为原生线程是OS级别的东西,所以编译器只是将系统调用关闭。

有几种语言(如Ruby)不使用本机线程,而是使用自己的“绿色”线程,它们在解释器中实现,因此看起来像是到OS的单个线程,但他们是例外而不是规则,并且在文档中通常很明显发生了什么。

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

- 亚当

0

由于OT她曾表示,任何现代操作系统都会为你做到这一点。然而,它的执行方式可能会对性能产生很大的影响,因此您可能希望按照您的操作系统预期的方式使用线程。这似乎有一个体面的主要操作系统使用的调度技术的概述。

+0

其中包括MSDOS,Windows 3.1和MacOS 9作为操作系统来避免,如果你碰巧在你的鸽舍中有一些好玩的软盘。 – 2009-02-03 18:43:16

7

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

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

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

还,这是很好的记忆,在大多数CPU受限的应用的最大瓶颈是内存带宽,通常不是CPU本身,所以有多个线程对同一内存战斗可能不是最好的设计。在通过小消息进行通信的几个单独进程中重构通常要好得多。

0

大多数现代操作系统都准备好用于多处理。因此,他们准备多核。但是,调度程序负责将线程分配给核心。 最高效的多核和多处理操作系统之一是FreeBSD。然而,并不是每个操作系统都能够将线程调度到不同的内核。例如,旧的Windows 98不适用于多个核心。另外,许多操作系统对最大内核数量都有限制。

我读过从用户谈论由Packt出版的一本新书中的一些#1职位和我发现在年底Packt出版网页下面的文章:

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

我读过Joe Duffy的书“与Windows同时编程”。现在,我在等待“C#2008和2005 Threaded Programming”,Hillar的书 - http://www.amazon.com/2008-2005-Threaded-Programming-Beginners/dp/1847197108/ref=pd_rhf_p_t_2

0

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

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

相关问题