【问题标题】:how kernel distinguishes between thread and process内核如何区分线程和进程
【发布时间】:2016-07-12 20:09:41
【问题描述】:

在 Linux 中,线程被称为轻量级进程。无论是进程还是线程,都是由task_struct数据结构实现的。

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

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

【问题讨论】:

    标签: linux multithreading process kernel


    【解决方案1】:

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

    来自http://www.kernel.org/doc/ols/2002/ols2002-pages-330-337.pdf 和来自Linux - Threads and Process

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

    和

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

    简单来说,当一个新进程被创建时,它就表现为一个线程 其中 PID 和 TGID 都是相同的(新)数字。

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

    所以一个主线程是一个具有相同 PID 和 TGID 的线程,而这个 PID 是一个进程 PID。一个线程(但不是主线程)有不同的 PID 但相同的 TID。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        你可以阅读 what-is-the-difference-between-a-process-and-a-thread首先澄清你对进程和线程的理解。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-23
          • 2021-09-27
          • 2012-03-27
          • 1970-01-01
          • 1970-01-01
          • 2015-03-27
          • 2013-05-16
          • 2011-02-02
          相关资源
          最近更新 更多