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.pdf和Linux - 线程和进程
\n\n\n\n\n这个问题在 2.4 开发周期中得到了解决,\n 添加了一个名为 \xe2\x80\x99 线程组\xe2\x80\x99 的概念。有一个属于线程组的所有任务的链接列表,并且有一个代表该组的 ID,称为 tgid。该 ID 实际上是组中第一个任务的 pid(pid 是分配给 Linux 任务的任务 ID),类似于会话和进程组的工作方式。此\n 功能是通过clone() 标志启用的。
\n
和
\n\n在内核中,每个线程都有自己的 ID,称为 PID(尽管将其称为 TID 或线程 ID 可能更有意义),并且它们还有一个 TGID(线程组 ID),即 PID启动整个过程的线程。
\n\n\n\n\n简单地说,当创建一个新进程时,它会显示为一个线程,其中 PID 和 TGID 都是相同的(新的)数字。
\n\n当一个线程启动另一个线程时,该启动的线程会获得自己的 PID(因此调度程序可以独立调度它),但它会继承原始线程的 TGID。
\n
因此,主线程是具有相同 PID 和 TGID 的线程,并且该 PID 是进程 PID。一个线程(但不是主线程)具有不同的 PID,但具有相同的 TID。
\n在内核内部,每个进程和线程都有一个唯一的ID(甚至同一进程的线程),该ID存储在pid变量中,同一进程的线程也共享一个存储在tgid变量中的公共ID,并在调用时返回给用户,getpid()因此允许内核将它们区分为本身可调度的不同实体。
当一个线程被同一进程的另一个线程抢占时,由于共享各种段(例如 .text、.bss、.data、文件描述符等),因此与不同进程进行上下文切换时相比,或者当不同进程的线程是上下文切换的。