我找不到类似的线程分组,用于由kthreadd生成的内核进程的“父”进程,我怀疑实现差异,因为此答案下的评论说“您无法在内核空间中使用POSIX线程”,而漂亮的线程分组是POSIX功能。因此,使用 ps -eLf ,我从未看到由kthreadd创建的内核进程的多个线程列出,它们具有方括号,例如[ksoftirqd / 0]或[nfsd],不像由init创建的用户空间进程。
来自用于用户空间的pthread的手册页面:
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).
然而,我没有看到内核“线程”在一个包含多个线程的进程中。简而言之,我从未看到'ps'列出的任何kthreadd子进程具有比一个更高的NLWP(线程)值,这使我想知道任何内核进程是否像用户空间程序(使用pthread)那样分叉/并行和多线程。这些实现的区别在哪里?
实际例子:NFS进程的ps auxf输出。
root 2 0.0 0.0 0 0 ? S Jan12 0:00 [kthreadd]
root 1546 0.0 0.0 0 0 ? S Jan12 0:00 \_ [lockd]
root 1547 0.0 0.0 0 0 ? S Jan12 0:00 \_ [nfsd4]
root 1548 0.0 0.0 0 0 ? S Jan12 0:00 \_ [nfsd4_callbacks]
root 1549 0.0 0.0 0 0 ? S Jan12 2:40 \_ [nfsd]
root 1550 0.0 0.0 0 0 ? S Jan12 2:39 \_ [nfsd]
root 1551 0.0 0.0 0 0 ? S Jan12 2:40 \_ [nfsd]
root 1552 0.0 0.0 0 0 ? S Jan12 2:47 \_ [nfsd]
root 1553 0.0 0.0 0 0 ? S Jan12 2:34 \_ [nfsd]
root 1554 0.0 0.0 0 0 ? S Jan12 2:39 \_ [nfsd]
root 1555 0.0 0.0 0 0 ? S Jan12 2:57 \_ [nfsd]
root 1556 0.0 0.0 0 0 ? S Jan12 2:41 \_ [nfsd]
默认情况下,当您启动rpc.nfsd服务(至少使用init.d服务脚本)时,它会生成8个进程(或者至少它们有PIDs)。如果我想编写一个多线程版本的NFS,它作为一个内核模块实现,那么为什么不能将默认的8个不同的nfsd进程分组到一个PID下,并在其中运行8个线程,而不是(如所示 - 与用户空间进程不同)八个不同的PID?
相比之下,NSLCD是一个使用多线程的用户空间程序的例子:
UID PID PPID LWP C NLWP STIME TTY TIME CMD
nslcd 1424 1 1424 0 6 Jan12 ? 00:00:00 /usr/sbin/nslcd
nslcd 1424 1 1425 0 6 Jan12 ? 00:00:28 /usr/sbin/nslcd
nslcd 1424 1 1426 0 6 Jan12 ? 00:00:28 /usr/sbin/nslcd
nslcd 1424 1 1427 0 6 Jan12 ? 00:00:27 /usr/sbin/nslcd
nslcd 1424 1 1428 0 6 Jan12 ? 00:00:28 /usr/sbin/nslcd
nslcd 1424 1 1429 0 6 Jan12 ? 00:00:28 /usr/sbin/nslcd
PID相同,但每个线程的LWP唯一。
kthreadd功能更新
从这个stack overflow答案中得知:
kthreadd是在内核空间运行的守护线程。原因是内核有时需要创建线程,但在内核中创建线程非常棘手。因此,kthreadd是内核用于从那里生成新线程(如果需要)的线程。该线程也可以访问用户空间地址空间,但不应该这样做。 它由内核管理...
和这个答案:
kthreadd()是守护进程kthreadd的主要函数(和主循环),是所有其他内核线程的父进程。
因此,在引用的代码中,有一个对kthreadd守护程序的请求创建。为了满足此请求,kthreadd将读取它并启动内核线程。
clone
时,您会为其设置标志以设置gid、pgid和其他一些内容。我想ps、top和其他类似的工具在某种程度上使用它们。我相信线程分组来自/proc/<pid>/task/<tid>结构。 - BitWhistler