linux环境编程-线程【后面还会介绍协程】

本文深入讲解了Linux环境下的线程概念及其与进程的关系,探讨了线程的实现原理,并列举了线程在进程中的共享与非共享资源。此外,还分析了线程相较于进程的优点与不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面我们介绍了进程的相关操作,今天我开始给大家介绍线程【包括线程同步,进程同步都会在这一章介绍(后面介绍)】。

一.线程概念

什么是线程:线程是操作系统调度的最小单位【书上】,在linux环境中线程的本质是一种轻量级的进程,LWP【light weight process】,因此在linux中进程有PCB,线程也有PCB,但是线程没有独立的地址空间。线程【可以看成合租】,进程【可以看成独居】【如图】

linux下:

  • 线程:最小的执行单位
  • 进程:最小分配资源单位,可以看成只有一个线程的进程。

 

注意:linux下的线程和windows下的线程底层实现几乎是完全不相同的。

思考1:为什么说进程的开销比线程小呢?

其实在 linux环境下 进程和线程的内存开销都是差不多的,为什么呢? 前面说了 线程虽然是 轻量级的进程,但是并没有说轻量多少,因为进程中有 读共享写复制的 机制,所以并不会花费多少内存。再者 说是 4 G 的 内存地址空间,你以为 你开辟一个 进程 操作系统真会分配给你 4G的实际空间嘛? 那只是虚拟的地址空间,实际可能只给你 要小的多。

思考2:为什么多线程比多进程 有更好的并发性呢?【我给大家画画图】

 

二.linux内核线程实现原理

类Unix系统中,早期是没有“线程”这个概念的,80年代才引入的,借助进程机制实现出了线程的概念【历史原因:因为linux中的进程已经足够的优秀了,但是为了与时俱进还是引出了线程的概念并实现】。因此在类Unix系统中,进程和线程都是密切相关的。

  • 1.轻量级进程(LWP),也有PCB,创建线程和创建进程使用的底层函数都是一样的,Clone.
  • 2.从内核的角度讲,进程和线程都是一样的,都有各自不同的PCB,但同一进程的多个线程中指向内存资源的三级页表是相同的
  • 3.进程可以蜕变成线程【通过pthread_create函数】。
  • 4.线程可以看成寄存器和栈的集合。【后面解释,有些也说是拥有对立的堆栈(堆空间其实在进程中是共享的一个区域,但是线程可以通过函数在堆上开辟一个属于自己的空间)】如图
  • 5.在linux下:线程是最小的执行单位【其实协程也是轻量级的线程】,进程是最小的分配资源的单位。

注意:其实linux系统中是有LWP号的,它的作用是什么呢? CPU就是LWP号来区分线程的,就类似于PID来区分进程一样,但是线程另外还有一个PID【线程ID】(这个PID和LWP号不同:它是进程用来操作和区分线程的)。

查看LWP号:ps -Lf pid 查看指定线程的lwp号

 

三.线程在进程中共享的资源

  • 1.文件描述符表【在PCB中,每个线程都有独立的PCB,但是三级映射表指向是相同的】
  • 2.每种信号的处理方式
  • 3.当前工作目录
  • 4.用户ID和组ID
  • 5.内存地址空间(.text/.data/.bss/heap/共享区)

四.线程在进程中非共享的资源

  1. 线程id
  2. 处理器现场和栈指针(内核栈)
  3. 独立的栈空间(用户空间栈)
  4. errno变量【多个线程共享进程地址空间,每个线程都有属于它自己的局部errno以避免一个线程干扰另一个线程】对于errno应当知道两条规则。第一条规则是:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。第二条是:任一函数都不会将errno 值设置为0,在<errno.h>中定义的所有常量都不为0。
  5. 信号屏蔽字【在PCB中,每个线程都有独立的PCB】

五.线程的优缺点

优点:1.提供程序的并发性,2.开销小【小不了多少】,3.数据通信,共享数据方便

缺点:1.库函数,不稳定,2.调试编程困难,gdb不支持,3.对信号的支持不好

总结:优点相对比较突出,缺点都是什么硬伤,linux下由于实现方法导致进程和线程的差别不是很大。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值