pthreads如何进行跨线程和调度

时间:2010-10-27 14:28:51

标签: pthreads multicore multithreading

我想知道,pthreads-win32(pthreads的windows实现)如何实现跨线程?它是用Windows API专门编写的吗?我检查了一些来源,似乎大多数确实用windows API编写,我想知道它是否使用Windows调度程序在线程(和核心)之间切换,还是实现自己的?具体而言,大多数处理器这些天来实现自己的调度程序(我读过有关安腾拱例如,硬连线的逻辑,每个核心支持两个线程,甚至它们之间的自动切换与硬件逻辑,所以显然对多核操作系统的支持不一定需要的话),因此,如果我有一个过时的OS例如Windows的32位或东西,其不支持多核心处理器,将与并行线程-win32的编写的程序仍然运行在一个以上的处理器核心或将只有一个核心是使用

pthreads实现(没有污染的posix线程)怎么样?它们是否支持多核处理器,即使它们运行的​​操作系统不支持?

我猜答案是否定的,对于Windows和posix版本,如果操作系统不支持多个内核,则只使用一个内核。这只是一个有根据的猜测,我想确认一下,所以请留言。

在一方请求中,您是否可以推荐一个支持多核线程执行的库,即使程序运行的操作系统不支持。如果存在任何c。

另外,有没有办法确保在不同内核上执行用pthreads编写的两个线程,或者OS(或处理器或pthreads lib)是否自动执行赋值? pthreads是否可以保证在不同的内核上执行?

干杯,Val

编辑: 我知道大多数这些问题都是特定于实现的,所以我指的是用于windows http://sourceware.org/pthreads-win32/的pthreads的这种实现。我之前没有特别提到它,因为据我所知,这是最流行和广泛使用的pthreads for windows实现。

2 个答案:

答案 0 :(得分:1)

因此,从我所得到的,所有这些中最重要的一点是线程与并行性(如UMA与多核处理器)几乎没有关系。因此,虽然线程可能是一种实现并发的技术,但它并不是确保ACTUAL并行执行的一种方式,这是我首先要寻找的,因为我正在研究并行和分布式系统和算法。

所以一次回答一个问题。是的,pthreads,可能大多数(如果不是全部)其他线程API都基于底层OS API。哪个给了他们与操作系统相同的限制。意思是,是的,如果操作系统(具体在这种情况下,某些窗口运行,例如pthreads-win32)不支持多个内核,则始终只使用一个内核。正如在提供的wiki页面上所指出的那样,引用:“超线程不仅要求操作系统支持多个处理器,还要求它专门针对HTT进行优化,而英特尔建议在使用具有HTT功能的操作系统时禁用HTT没那么优化。“ http://en.wikipedia.org/wiki/Hyper-threading在大多数情况下,只有硬连线处理器(基本)调度程序不足以利用多个内核,它必须得到SW(OS支持)的支持/使用。

虽然这可能不是一个明确的证据,但我相信有足够的证据指向同一方向,以证实情况属实。

我没有通过pthreads(对于符合posix的操作系统)来源筛选,我猜这个API也是如此,因为它很可能使用底层的OS API。您必须自己确认。 :)

此外,任何可能支持在多个内核上执行的潜在库,即使它们运行的​​操作系统不支持多个内核,您也必须自己找到它们(如果它们存在),请发表评论。

为确保手动并行(在不同内核上执行),linux确实提供了一种将线程固定到特定虚拟处理器的方法(在某些条件下)。要将整个进程固定到特定(虚拟)处理器/核心,可以使用sched_setaffinity()(来自sched.h)。正如nos指出的那样,pthreads提供了pthread_setaffinity_np()来将特定线程固定到特定的核心。 Windows支持与SetThreadAffinityMask()类似的功能,因此很明显,可以手动分配线程以在不同内核上并行运行(如果操作系统支持多核)。

根据我使用pthread编码的经验,如果你编写使用多个线程(超过2个)的代码,它们应该在多个物理内核上执行(如果可用)(这可能是pthreads使用的操作系统特性)。

我的问题很开始,因为大多数这些都是特定于实现的,所以很难给出一个答案。我希望这个答案足够详细,可以帮助你澄清一些事情。

干杯,Val

答案 1 :(得分:0)

通常,每个现代操作系统都支持线程,并将它们安排到系统的不同(虚拟)核心。操作系统提供了一些通用的同步技术(如互斥锁或信号量或障碍),pthread使用它们来实现pthreads API。

在某些Intel处理器(如Itanium)上,每个Core有两个线程(我认为你的意思是超线程),操作系统会看到两个“虚拟”核心。处理器确实将两个线程调度到一个物理核心上。 (见Wikipedia

然而,有些例子中Runtime-Plattforms实现了他们自己的Thread-Conceptepts并进行了调度:我认为Java的(至少是较旧的)实现有自己的调度例程。