![内核如何知道哪些“线程”/进程与进程关联?](https://linux22.com/image/132879/%E5%86%85%E6%A0%B8%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%93%AA%E4%BA%9B%E2%80%9C%E7%BA%BF%E7%A8%8B%E2%80%9D%2F%E8%BF%9B%E7%A8%8B%E4%B8%8E%E8%BF%9B%E7%A8%8B%E5%85%B3%E8%81%94%EF%BC%9F%20.png)
正如我所读到的,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条目,进程的所有线程具有相同的值(也称为tid的PID)。
答案2
除第一个线程(init)外,每个线程都有一个父线程。您可以使用 f 标志到 ps 来最好地查看关系,这样:“ps faux”(无引号)。
答案3
/bin/ps -eo pid,nlwp,tid,args -L