朋友们好,这里简要介绍了进程和线程的区别以及对LINUX中线程ID的理解,本人目前理解尚浅,若文中有表述不当的地方还望理解并指正,谢谢大家!
文章目录
- 一:进程和线程
- 二:线程ID和进程地址空间布局
一:进程和线程
- 进程是资源分配的基本单位。
- 线程是调度的基本单位。
- 线程可见进程的数据,但也拥有自己一部分数据:
线程ID、一组寄存器、独立栈结构、errno、信号屏蔽字、调度优先级。
上述中**独立栈结构和线程各自拥有一组寄存器**是理解线程的关键。
进程的多个线程共享同一地址空间,因此代码段、数据段都是共享的,如果定义一个函数(在代码段),那么在各个线程中都可以调用,如果定义一个全局变量,那么在各个线程中都可以访问到。除此之外,各线程还共享以下进程资源和环境:
- 文件描述符
- 每种信号的处理方式
- 当前工作目录
- 用户的id和组id
二:线程ID和进程地址空间布局
pthread_t到底是什么类型?
取决于实现。对于目前Linux实现的NPTL实现而言,pthread_t类型的线程ID本质上就是进程地址空间上的一个地址。
💡理解pthread_t:
- 线程是一个独立的执行流。
- 线程一定会在自己运行的过程中,产生临时数据(调用函数、定义局部变量等)。
- 线程一定有自己独立的栈结构。
我们在Linux中使用的线程,都是由pthread库给我们提供的,操作系统只是提供了执行流,具体的线程结构由库来管理。
库如果要管理线程,那么必然在库中涉及到很多线程的结构体对象!
struct thread_info
{
pthread_t tid;
void* stack;
...
...
};
主线程的独立栈结构用的就是虚拟地址空间中的栈区,新线程用的栈结构,用的是库中提供的栈结构!
综上所述:pthread_t类型的线程ID本质上就是进程地址空间上的一个地址。
- pthread_create函数会产生一个线程ID,存放在第一个参数指向的地址中。该线程ID和进程ID不是一回事。
- 进程ID是属于进程调度的范畴。因为线程是轻量级线程,是操作系统调度的最小单位,所以需要一个数值来唯一的表示该线程。
- pthread_t pthread_self(void);谁调用这个函数,就可以获得谁的线程ID。