内核如何知道哪些“线程”/进程与进程关联?

内核如何知道哪些“线程”/进程与进程关联?

正如我所读到的,Linux 中的“线程”只是一个进程。

假设一个进程创建了两个“线程”,现在当进程终止时,与该进程关联的两个“线程”/进程也将被终止。

与进程(创建它们的)关联的“线程”/进程的信息存储在哪里?

答案1

信息存储在内存中任务结构称为task_struct与每个进程/线程相关联。所有这些信息都像往常一样在伪文件系统中提供,/proc如中所述man 5 proc

当一个进程被杀死并将消失时,内核只是在内存中解析与该进程关联的线程列表(在 中很方便地可见/proc/[pid]/task/)以杀死它们。

Linux中的进程/线程表示模型并没有将进程和线程分开太多,它们都是任务。例如,它们共享相同的任务命名空间,如/proc/组织中所示PID(进程 ID)或tid(线程ID)相同。但也有差异,例如获取pid()将返回线程的PID, 尽管盖蒂德() 将返回线程的tid。当线程调用它们时,它们可以返回不同的值。

与问题相关的是,那些伪文件是否映射到任务结构内容:

  • /proc/[pid]/task/

    这是一个目录,其中包含进程中每个线程的一个子目录。每个子目录的名称是线程的数字线程 ID ([tid])(请参阅 gettid(2))。在每个子目录中,都有一组与 /proc/[pid] 目录下具有相同名称和内容的文件。对于所有线程共享的属性,task/[tid]子目录下每个文件的内容将与父/proc/[pid]目录中相应文件的内容相同(例如,在多线程进程中) ,所有的task/[tid]/cwd文件将与父目录中的/proc/[pid]/cwd文件具有相同的值,因为进程中的所有线程共享一个工作目录)。对于每个线程不同的属性,task/[tid]下的相应文件可能具有不同的值(例如,每个task/[tid]/status文件中的各个字段对于每个线程可能不同),或者它们可能具有不同的值。 /proc/[pid] 中根本不存在。在多线程进程中,如果主线程已经终止(通常通过调用 pthread_exit(3)),则 /proc/[pid]/task 目录的内容不可用。

  • /proc/[pid]/status

    Tgid:线程组ID(即进程ID)。

    这个伪文件有一个tgid条目,进程的所有线程具有相同的值(也称为tidPID)。

man 7 pthreads更多信息可以在当前的描述中看到NPTL 执行

答案2

除第一个线程(init)外,每个线程都有一个父线程。您可以使用 f 标志到 ps 来最好地查看关系,这样:“ps faux”(无引号)。

答案3

/bin/ps -eo pid,nlwp,tid,args -L

相关内容