Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C smp系统上的Posix线程_C_Linux_Pthreads - Fatal编程技术网

C smp系统上的Posix线程

C smp系统上的Posix线程,c,linux,pthreads,C,Linux,Pthreads,我在linux系统中开发了一个C应用程序,其中包含12个posix线程。这是一个多核系统。 阅读之后,我发现内核只知道我的进程,它不知道线程(posix库将负责)。 在这种情况下,我的12个线程是否只使用一个进程被调度的内核,或者我的线程是否可以在所有可用的内核中运行? Posix库可以将线程调度到其他内核吗?历史上,有相当多的库实现了Posix线程之类的功能。LinuxThreads附带glibc,但由于早期内核的限制(例如特定于线程的当前目录和umask),它存在严重的一致性问题。它实际上可

我在linux系统中开发了一个C应用程序,其中包含12个posix线程。这是一个多核系统。 阅读之后,我发现内核只知道我的进程,它不知道线程(posix库将负责)。 在这种情况下,我的12个线程是否只使用一个进程被调度的内核,或者我的线程是否可以在所有可用的内核中运行?
Posix库可以将线程调度到其他内核吗?

历史上,有相当多的库实现了Posix线程之类的功能。LinuxThreads附带glibc,但由于早期内核的限制(例如特定于线程的当前目录和umask),它存在严重的一致性问题。它实际上可以在同一个进程中同时在不同的CPU上运行多个线程(当时人们没有提到内核)。FSU线程具有更好的POSIX一致性(如果我没记错的话,即使在PI调度方面也是如此),但每个进程只能有一个CPU。许多线程库还试验了n:m方案,其中大量用户空间线程在少量内核调度线程(可以在不同CPU上并行运行)上执行


对于Linux和C/C++,当NPTL被添加到glibc中并与库的其余部分越来越紧密地集成时,这种情况就基本停止了。NPTL有一个1:1的模型:每个用户空间线程对内核都是可见的,只要有足够的硬件资源可用,就可以并行运行。

阅读后,我发现内核只知道我的进程,它将不知道线程(posix库将负责)。你在哪里读到的?某些实现可能是这样,但一般来说,它介于严重过时和完全错误之间。尽管可以想象pthreads API完全可以在用户空间中实现,因此不同的线程确实不能同时调度到不同的内核上,这不是Glibc在Linux上的实际实现方式。您可能会被Linux没有对进程和线程进行严格区分的事实所迷惑,但这与内核出于调度目的不知道线程的情况完全不同。调度程序更喜欢在同一个内核上运行线程,因为它们使用相同的缓存。这会提供更好的性能。确实如此,所以我不完全理解你的问题。谢谢你提供的信息。我们也可以参考下面的链接。似乎Linux并不完全符合POSIX,因为它将线程视为LWP(1:1模型),以支持SMP系统。