【问题标题】: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
          相关资源
          最近更新 更多