初步了解Linux中的线程与进程
Posted bcbobo21cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初步了解Linux中的线程与进程相关的知识,希望对你有一定的参考价值。
在 Linux 内核中并没有对线程做特殊处理,还是由 task_struct 来管理。从内核的角度看,用户态的线程本质上还是一个进程。只不过和普通进程比,稍微“轻量”了那么一些。
一、线程的创建方法
......进入 clone 系统调用,之后会进入内核中进行处理;
//file:sysdeps/unix/sysv/linux/i386/clone.S
ENTRY (BP_SYM (__clone))
...
movl $SYS_ify(clone),%eax
...
二、内核中对线程的表示
task_struct 具体的定义,它位于 include/linux/sched.h。
struct task_struct
volatile long state;
pid_t pid;
pid_t tgid;
struct task_struct __rcu *parent;
struct list_head children;
struct list_head sibling;
struct task_struct *group_leader;
int prio, static_prio, normal_prio;
unsigned int rt_priority;
struct mm_struct *mm, *active_mm;
struct fs_struct *fs;
struct files_struct *files;
struct nsproxy *nsproxy;
...
对于线程来讲,所有的字段都是和进程一样的(本来就是一个结构体来表示的)。
在 Linux 中,每一个 task_struct 都需要被唯一的标识,它的 pid 就是唯一标识号。
struct task_struct
......
pid_t pid;
pid_t tgid;
对于进程来说,这个 pid 就是我们平时常说的进程 pid。
对于线程来说,我们假如一个进程下创建了多个线程出来。那么每个线程的 pid 都是不同的。但是我们一般又需要记录线程是属于哪个进程的。这时候,tgid 就派上用场了,通过 tgid 字段来表示自己所归属的进程 ID。
这样内核通过 tgid 可以知道线程属于哪个进程。
......
以上是关于初步了解Linux中的线程与进程的主要内容,如果未能解决你的问题,请参考以下文章