内核如何区分线程和进程

use*_*287 5 linux multithreading kernel process

Linux 中的线程被称为轻量级进程。无论是进程还是线程,它们都是通过task_struct数据结构来实现的。

1> 那么,从这个意义上说,内核如何区分线程和进程?

2> 当发生上下文切换时,线程如何在上下文切换中获得更少的开销?因为在此线程之前,另一个进程的另一个线程可能正在运行。因此,即使资源在进程的线程之间共享,内核也应该加载所有资源。

小智 5

\n

内核如何区分线程和进程。

\n
\n\n

来自http://www.kernel.org/doc/ols/2002/ols2002-pages-330-337.pdfLinux - 线程和进程

\n\n
\n

这个问题在 2.4 开发周期中得到了解决,\n 添加了一个名为 \xe2\x80\x99 线程组\xe2\x80\x99 的概念。有一个属于线程组的所有任务的链接列表,并且有一个代表该组的 ID,称为 tgid。该 ID 实际上是组中第一个任务的 pid(pid 是分配给 Linux 任务的任务 ID),类似于会话和进程组的工作方式。此\n 功能是通过clone() 标志启用的。

\n
\n\n

\n\n

在内核中,每个线程都有自己的 ID,称为 PID(尽管将其称为 TID 或线程 ID 可能更有意义),并且它们还有一个 TGID(线程组 ID),即 PID启动整个过程的线程。

\n\n
\n

简单地说,当创建一个新进程时,它会显示为一个线程,其中 PID 和 TGID 都是相同的(新的)数字。

\n\n

当一个线程启动另一个线程时,该启动的线程会获得自己的 PID(因此调度程序可以独立调度它),但它会继承原始线程的 TGID。

\n
\n\n

因此,主线程是具有相同 PID 和 TGID 的线程,并且该 PID 是进程 PID。一个线程(但不是主线程)具有不同的 PID,但具有相同的 TID。

\n


Rac*_*yal 5

在内核内部,每个进程和线程都有一个唯一的ID(甚至同一进程的线程),该ID存储在pid变量中,同一进程的线程也共享一个存储在tgid变量中的公共ID,并在调用时返回给用户,getpid()因此允许内核将它们区分为本身可调度的不同实体。

当一个线程被同一进程的另一个线程抢占时,由于共享各种段(例如 .text、.bss、.data、文件描述符等),因此与不同进程进行上下文切换时相比,或者当不同进程的线程是上下文切换的。


gzh*_*gzh 0

看来您将一些概念混合在一起,由相同的数据结构实现并不意味着它们以相同的方式运行。

您可以阅读 进程和线程之间的区别是什么,以首先阐明您对进程和线程的理解。