初步了解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中的线程与进程的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-初步认识-第十二章-多线程概述

进程管理内存管理存储管理初步了解

python爬虫番外篇进程,线程的初步了解

线程初步

图解 | 4道题带你初步了解浏览器的EventLoop

线程与进程的初步学习