内核如何区分线程和进程

5
在Linux中,线程被称为轻量级进程。无论是进程还是线程,它们都是通过 `task_struct` 数据结构实现的。
1> 那么,在这个意义上,内核如何区分线程和进程?
2> 当发生上下文切换时,线程如何在上下文切换中减少开销?因为在这个线程之前,可能正在运行来自另一个进程的另一个线程。所以内核应该加载所有资源,即使这些资源在进程的线程之间共享。
3个回答

5
在内核中,每个进程和线程都有一个唯一的ID(即使是同一进程的线程),存储在pid变量中。同一进程的线程也共享一个常见的ID,存储在tgid变量中,并在调用getpid()时返回给用户,因此允许内核将它们区分为不同的实体,在它们自己的调度中可调度。
当同一进程的另一个线程抢占了线程时,由于各种段(如.text,.bss,.data,文件描述符等)是共享的,因此与上下文切换不同的进程或不同进程的线程相比,可以快速进行上下文切换。

5
这篇文章介绍了内核如何区分线程和进程。在2.4版本的开发周期中,通过引入“线程组”的概念来解决这个问题。所有属于线程组的任务都被连接成一个链表,并且有一个表示该组的 ID,称为 tgid。实际上,这个 ID 是组中第一个任务的 pid(pid 是分配给 Linux 任务的任务 ID),类似于会话和进程组的工作方式。通过对 clone() 设置标志启用此功能。参考链接:http://www.kernel.org/doc/ols/2002/ols2002-pages-330-337.pdfLinux - Threads and Process
在内核中,每个线程都有自己的ID,称为PID(虽然将其称为TID或线程ID可能更有意义),它们还具有TGID(线程组ID),这是启动整个进程的线程的PID。
简单地说,当创建新进程时,它会出现为一个线程,其中PID和TGID都是相同的(新)数字。
当一个线程启动另一个线程时,启动的线程会获得自己的PID(因此调度程序可以独立地对其进行调度),但它会继承原始线程的TGID。
因此,主线程是具有相同PID和TGID的线程,并且此PID是进程PID。线程(但不是主线程)具有不同的PID,但具有相同的TID。

0

看起来你把一些概念混淆了,使用相同的数据结构实现并不意味着它们以相同的方式运行。

首先,你可以阅读进程和线程之间的区别是什么 来澄清你对进程和线程的理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接