我在许多地方都读到Linux在Java VM中为每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:
- 创建用于执行核心OS工作的线程,以及
- 操作系统知道的线程,并计划执行用户工作。
我说的是后一种。)
内核线程是否与内核进程相同,因为Linux进程支持父级和子级之间的共享内存空间,或者它确实是一个不同的实体?
我在许多地方都读到Linux在Java VM中为每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:
我说的是后一种。)
内核线程是否与内核进程相同,因为Linux进程支持父级和子级之间的共享内存空间,或者它确实是一个不同的实体?
Answers:
该文档可能会非常混乱,因此这里是“ 真实的 ” Linux模型:
getpid()
从任何进程调用都会返回其TGID(=“主线程” PID),gettid()
从任何进程调用都会返回其PID(!),clone(2)
系统调用创建任何类型的过程,ls /proc
如/proc/NUMBER
TGID,/proc/TGID/task
以及/proc/TGID/task/NUMBER
PIDls /proc
,您仍然可以做到cd /proc/any_PID
。结论:从内核的角度来看,只有进程存在,每个进程都有自己独特的PID,所谓的线程只是一种不同的进程。
注意: Linux中“线程”概念的实现导致词汇混乱,如果getpid()
撒谎对您不起作用,这是因为其行为遵循POSIX兼容性(线程应该共享一个共同的PID) 。
线程是Linux下的进程。它们是通过clone
系统调用创建的,该系统调用返回一个进程ID,该ID可以kill
像进程一样通过系统调用发送信号。线程进程在ps
输出中可见。该clone
调用传递它确定有多少父进程的环境与线程进程共享的标志。
pthreads(7)
说,对于当前的NPTL(本机POSIX线程库)实现,“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享相同的PID”。在过时的LinuxThreads实现中,每个“线程”都有自己的PID。