对于Linux用户空间进程,确定哪些进程是多线程似乎很容易.您可以使用ps -eLf并查看NLWP值以获取线程数,这也与/ proc/$ pid/status中的' Threads: '值相对应.显然,在LinuxThreads的那一天,实现不符合POSIX标准.但是这个stackoverflow回答说" POSIX.1要求线程共享一个相同的进程ID ",这显然在NPTL中得到了纠正.因此,使用NPTL,它允许使用ps -eLf之类的命令显示线程,因为线程都共享相同的PID,您可以在/ proc/$ pid/task /下验证 并查看属于该"父"进程的所有线程子文件夹.
我无法在kthreadd生成的内核进程的"父"进程下找到类似的线程分组,我怀疑实现的差异,因为在这个答案下的注释说" 你不能在内核空间中使用POSIX线程 "和漂亮的线程分组是POSIX功能.因此,对于ps -eLf,我从来没有看到为kthreadd创建的内核进程列出的多个线程,它们周围有方括号,如[ksoftirqd/0]或[nfsd],与init创建的用户空间进程不同.
从pthreads的手册页(在用户空间中使用):
A single process can contain multiple threads, all of which are
executing the same program. These threads share the same global
memory (data and heap segments), but each thread has its own stack
(automatic variables).
Run Code Online (Sandbox Code Playgroud)
然而,就一个包含多个线程的进程而言,这正是我没有看到的内核"线程".
简而言之,我从来没有看到'ps'列出的任何进程是kthreadd的子进程,其NLWP(线程)值大于1,这让我想知道是否有任何内核进程分叉/并行化和多线程如用户空间程序(用pthreads).实施方式有何不同?
实际示例: 来自ps auxf的NFS进程输出. …