Linux内核中,进程与线程如何区分?

摘要:Linux 3.2 进程, 线程 前言 注意: 本文章默认你学过操作系统的进程部分,了解进程的概念. 我们都知道, 在 Linux 中, 我们使用 LWP 来描述线程, 即不区分线程进程, 统一用 task_struct 描述它. 但是在
Linux 3.2 进程, 线程 前言 注意: 本文章默认你学过操作系统的进程部分,了解进程的概念. 我们都知道, 在 Linux 中, 我们使用 LWP 来描述线程, 即不区分线程/进程, 统一用 task_struct 描述它. 但是在 Linux 中, 线程, 进程, 进程组实际上还是有点区别的. 这篇文章来聊聊进程, 线程. 1.Linux 的 task_struct 1.1 task_struct 结构体介绍 如 LKD 中所讲的, Linux 采用 task_struct 来描述进程. 当然, 这只是简写. 实际上, Linux 的 task_struct 要比文章中写的复杂的多. 每个字段的用途, 到时候穿插在其他文章讲吧, 一次性摆在这会容易绕晕. 1.2 CPU核心如何获取当前进程的的 task_struct? 答案藏在之前所讲的 current_thread_info 里面. struct thread_info { struct task_struct *task; //... } 之前文章讲过, 在 x86_64 中, thread_info 存在于当前 CPU 核心的内核栈中, 而 current_thread_info 就是获取这个变量. 那我们只需要执行以下代码, 就可以获取当前正在执行的 task_struct 了: struct task_struct* tsk = current_thread_info()->task; 2.Linux 中的进程链表 首先我们要研究的就是 task_struct 中的如下几个字段. struct task_struct { struct list_head sibling; //兄弟节点 struct list_head children; //孩子节点 struct list_head real_parent; //创建时候的父进程 struct list_head parent; //更准确的说, 这个是负责接收收尸信号 SIGCHLD 的进程 struct signal_struct signal; //后面要考 }; 每个字段的作用, 都在上面注释的很清楚了. 在 Linux 中, 进程以树的方式组织起来。
阅读全文