English 中文(简体)
在哪种操作系统中,线程编程足以利用多个核心?
原标题:
  • 时间:2009-02-03 18:25:17
  •  标签:

我想运用我的多线程编程技巧(我有技能),但我意识到仅有这些还不够。如果操作系统不了解潜在的情况,我的线程仍然可能竞争同一个核心。在Intel Xeon架构上,我应该使用哪种OS/编译器/库组合来将线程分配到核心上呢?

问题回答

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

  • 绿色线程。在多个 CPU 不常见而且操作系统没有被优化到足够程度时,它曾经具有性能优势。有几个 Java 虚拟机宣称这是一个特性,后来转向 M:N 方案,我认为现在到处都是 N:N。

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

同时,需要记住大多数CPU密集型应用程序中最大的瓶颈是RAM带宽,通常不是CPU本身,因此有多个线程争夺同一内存可能不是最好的设计。通常更好的方法是将它们重构为通过小型消息通信的几个单独的进程。

在每个操作系统上都是线程的定义。

如果你创建了一个启动两个线程的应用程序,那么操作系统可以将它们放在两个不同的核心上。这在 Windows、OSX、Linux 和其他任何你能想到的操作系统上都是有效的。

既然你“有技能”,我假设你已经知道现代大部分操作系统都会利用多核心来执行你的线程,前提是你的线程没有锁定问题,否则它们的运行就是顺序的。

所以我猜你真正想知道如何将你的线程绑定到核心,以免它们互相竞争。这可以通过设置线程的处理器亲和性来完成。以下是有关此操作的Windows和Linux文章链接。我相信其他Unix版本也有类似的文章。我还要注意的是,通常情况下这并不必要,因为除了一些特殊情况,操作系统知道比你更好地安排线程的调度。请记住,现代操作系统是多处理器的,因此你的线程不仅与彼此竞争,还与盒子上所有其他进程的线程竞争。根据负载情况,将你的线程限制在一个核心上可能会使它们更快。

将此翻译为中文:http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/core/fnef_mul_dnpl.mspx?mfr=true 微软官网链接: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 http://www.ibm.com/developerworks/linux/library/l-affinity.html

据我所知,几乎所有现代操作系统都能够跨多个内核安排线程。我曾经使用过的 Unix 变体肯定不会有任何问题,而且我相当肯定所有的 Windows 都可以良好处理。编译器不是问题,因为本地线程是操作系统级别的事情,编译器只是将系统调用传递下去。

有一些语言(如Ruby)不使用本地线程,而是使用它们自己的“绿色”线程,这些线程由解释器实现,因此对于操作系统来说它们看起来像是单个线程,但这只是个例外而不是规则,在文档中通常很明显地说明了发生了什么。

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

你需要编写能够同时多线程 (SMT) 的代码。大多数操作系统都支持这个功能 - 唯一的区别在于您的软件如何处理锁定和资源。如果您的线程需要访问相同的内存或资源,那么就会发生争用,这会导致一个或另一个被阻塞在等待资源、内存或其他锁定的时间点上。

大多数具有线程功能的编程语言同样具备这个功能 - 确保它同时运行,完全取决于程序员。

您可以在Windows上使用Visual Studio C++查找有关如何执行此操作的信息。

将此翻译为中文:http://msdn.microsoft.com/en-us/library/172d2hhw.aspx http://msdn.microsoft.com/en-us/library/172d2hhw.aspx

这方面有许多教程,特别是针对Windows系统的(如C#,C ++,VB等),可以通过搜索找到。

同时多线程 C++

亚当

正如其他人所说,任何现代操作系统都会为您完成这个任务。然而,它完成任务的方式可能会对性能产生重大影响,因此您可能会想要按照您的操作系统意图使用线程。这篇维基百科文章似乎对主要操作系统使用的调度技术有一个不错的概述。

Most modern operating systems are prepared for multiprocessing. Hence, they are prepared for multicore. However, the scheduler is the responsible for distributing the threads to the cores. One of the most efficient multicore and multiprocessing OS is FreeBSD. However, not every OS is capable of scheduling threads to different cores. For example, the old Windows 98 does not work with more than one core. Besides, many OS have restrictions on the maximum number of cores.

我在Stackoverflow上阅读了一些用户关于Packt出版社新书的帖子,然后我在Packt出版社的网页上找到了以下文章:

将此翻译成中文:http://www.packtpub.com/article/simplifying-parallelism-complexity-c-sharp 简化C#并行性复杂性

我已经读过Joe Duffy的书《Concurrent Programming with Windows》。现在,我正在等待Hillar的书《C# 2008 and 2005 Threaded Programming》- http://www.amazon.com/2008-2005-Threaded-Programming-Beginners/dp/1847197108/ref=pd_rhf_p_t_2

In another post, I recommended a new book. If you are looking for a deep answerd, I do recommend you to read the first two chapters of "C# 2008 and 2005 threaded programming", by Gaston C. Hillar - Packt Publishing. I didn t know the answer to your question before I bought the book 5 days ago. Now, I am capable of watching my Core 2 Quad Q6700 reach 98% CPU usage programming in C# using 4 concurrent threads! It is easier than I thought. If you have multithreaded knowledge, it will be even easier for you. I am impressed with the results you can achieve using many cores at the same time. I recommend the book to those who are interested in beginning with multicore or threaded programming using C#. I am not a C++ programmer. For this reason, I needed a C# beginner s book to exploit multicore using threads.





相关问题
热门标签