Linux内核线程真的是内核进程吗?


19

我在许多地方都读到Linux在Java VM中为每个用户线程创建一个内核线程。(我看到术语“内核线程”以两种不同的方式使用:

  1. 创建用于执行核心OS工作的线程,以及
  2. 操作系统知道的线程,并计划执行用户工作。

我说的是后一种。)

内核线程是否与内核进程相同,因为Linux进程支持父级和子级之间的共享内存空间,或者它确实是一个不同的实体?

Answers:


23

在Linux上,线程和进程之间绝对没有区别。如果查看clone(2),将看到一组标志,这些标志确定线程之间共享什么,不共享什么。

经典进程只是不共享任何内容的线程。您可以在Linux下共享所需的组件。

在其他OS实现上则不是这种情况,在其他实现上存在更多实质性差异。


22

该文档可能会非常混乱,因此这里是“ 真实的 ” Linux模型:

  • 在Linux内核中,可以运行(和计划)的东西称为“进程”,
  • 每个进程都有一个系统唯一的进程ID(PID)和一个线程组ID(TGID),
  • 一个“正常”进程具有PID = TGID,并且没有其他进程共享该TGID值,
  • “线程”进程是TGID值由其他进程共享的进程,
  • 共享同一个TGID的多个进程也至少共享相同的内存空间和信号处理程序(有时更多),
  • 如果“线程化”进程的PID = TGID,则可以将其称为“主线程”,
  • getpid()从任何进程调用都会返回其TGID(=“主线程” PID),
  • gettid()从任何进程调用都会返回其PID(!),
  • 可以使用clone(2)系统调用创建任何类型的过程,
  • 您可以列出的文件夹的数字名称,ls /proc/proc/NUMBERTGID,
  • 文件夹的数字名称/proc/TGID/task以及/proc/TGID/task/NUMBERPID
  • 即使您没有看到每个现有的PID ls /proc,您仍然可以做到cd /proc/any_PID

结论:从内核的角度来看,只有进程存在,每个进程都有自己独特的PID,所谓的线程只是一种不同的进程。

注意: Linux中“线程”概念的实现导致词汇混乱,如果getpid() 撒谎对您不起作用,这是因为其行为遵循POSIX兼容性(线程应该共享一个共同的PID) 。


1
建议:使用“任务”一词可能有助于指代可运行的东西,而不会引起太多的进程/线程混乱。
Totor

17

线程是Linux下的进程。它们是通过clone系统调用创建的,该系统调用返回一个进程ID,该ID可以kill像进程一样通过系统调用发送信号。线程进程在ps输出中可见。该clone调用传递它确定有多少父进程的环境与线程进程共享的标志。


1
那个人pthreads(7)说,对于当前的NPTL(本机POSIX线程库)实现,“一个进程中的所有线程都放在同一个线程组中;线程组的所有成员共享相同的PID”。在过时的LinuxThreads实现中,每个“线程”都有自己的PID。
Totor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.