Linux线程概念

什么是线程?

  • 一个程序里的一个执行路径就叫做线程(thread)
  • 线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位
  • 线程在进程内部运行,本质是在进程地址空间内运行
  • 一个进程至少有一个线程
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

Linux系统中其实没有真正意义上的线程,Linux的线程就是轻量级的进程

在创建一个进程的时候,操作系统会相应的为进程创建相应的数据结构,开辟相应的内存,创建一个虚拟的进程地址空间。

也可以说,进程是承担分配系统资源的基本实体

如果我们在创建"进程"的时候,只创建进程的PCB,进程的地址空间和相应的数据结构不创建,和别人共享一份,那么创建出来的进程就会这样:

请添加图片描述

以前我们创建的进程一个PCB对应一份资源,而这样创建出来的进程,多个进程共用一份资源一个PCB对应的是一个程序的执行流,那这样的进程就叫做线程

而线程在CPU看来其实就是一个个进程,也就是说,线程是调度的基本单位

进程真正的理解,其实是共用一份资源多个线程的整体

请添加图片描述

我们以前理解的进程,实际上是只有一个线程的进程。也就是只有一个执行流的进程,一个PCB独享一份资源。

线程的优点

  • 创建一个新线程的代价要比创建一个新进程小得多
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源要比进程少很多
  • 充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

线程的缺点

  • 性能损失
    一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
    编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
  • 缺乏访问控
    进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
    多个执行流,会让代码调试更加复杂
  • 线程异常导致整个进程退出
    单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃,线程是进程的执行分支,所以线程出现异常就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有进程也就随即退出。

线程的用途

  • 合理的使用多线程,能提高CPU密集型程序的执行效率
  • 合理的使用多线程,能提高IO密集型程序的用户体验

进程和线程的区别

进程是资源分配的基本单位,线程是调度的基本单位

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

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

线程共享进程数据,但也拥有自己的一部分数据:

  • 线程ID
  • 一组寄存器
  • errno
  • 信号屏蔽字(block表)
  • 调度优先级
Logo

更多推荐