内核如何区分线程和进程

时间:2016-03-25 03:45:31

标签: linux multithreading process kernel

Linux线程中的

称为轻量级进程。无论是流程还是线程,它们都是由task_struct数据结构实现的。

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

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

3 个答案:

答案 0 :(得分:3)

  

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

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

  

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

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

  

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

     

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

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