Linux中如何理解线程?线程ID到底是什么?

81 篇文章 2 订阅
65 篇文章 4 订阅

朋友们好,这里简要介绍了进程和线程的区别以及对LINUX中线程ID的理解,本人目前理解尚浅,若文中有表述不当的地方还望理解并指正,谢谢大家!

一:进程和线程

在这里插入图片描述

  • 进程是资源分配的基本单位。
  • 线程是调度的基本单位。
  • 线程可见进程的数据,但也拥有自己一部分数据:
    线程ID、一组寄存器、独立栈结构、errno、信号屏蔽字、调度优先级。

上述中**独立栈结构和线程各自拥有一组寄存器**是理解线程的关键。

进程的多个线程共享同一地址空间,因此代码段、数据段都是共享的,如果定义一个函数(在代码段),那么在各个线程中都可以调用,如果定义一个全局变量,那么在各个线程中都可以访问到。除此之外,各线程还共享以下进程资源和环境:

  • 文件描述符
  • 每种信号的处理方式
  • 当前工作目录
  • 用户的id和组id

二:线程ID和进程地址空间布局

pthread_t到底是什么类型?
取决于实现。对于目前Linux实现的NPTL实现而言,pthread_t类型的线程ID本质上就是进程地址空间上的一个地址。
在这里插入图片描述

💡理解pthread_t:

  1. 线程是一个独立的执行流。
  2. 线程一定会在自己运行的过程中,产生临时数据(调用函数、定义局部变量等)。
  3. 线程一定有自己独立的栈结构。

我们在Linux中使用的线程,都是由pthread库给我们提供的,操作系统只是提供了执行流,具体的线程结构由库来管理。
库如果要管理线程,那么必然在库中涉及到很多线程的结构体对象!

struct thread_info
{
	pthread_t tid;
	void* stack;
	...
	...
};

在这里插入图片描述
主线程的独立栈结构用的就是虚拟地址空间中的栈区,新线程用的栈结构,用的是库中提供的栈结构!

综上所述:pthread_t类型的线程ID本质上就是进程地址空间上的一个地址。

  1. pthread_create函数会产生一个线程ID,存放在第一个参数指向的地址中。该线程ID和进程ID不是一回事。
  2. 进程ID是属于进程调度的范畴。因为线程是轻量级线程,是操作系统调度的最小单位,所以需要一个数值来唯一的表示该线程。
  3. pthread_t pthread_self(void);谁调用这个函数,就可以获得谁的线程ID。
  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值