Linux_线程基础

线程的概念

  • 线程(thread)是操作系统能够进行运算调度的最小单位,它包含在进程之中,是进程中的实际运作单位。
  • 一条线程指的是进程中一个单一顺序的控制流,一个进程可以并发多个线程,每条线程并行执行不同的任务。
  • linux下线程是以进程 pcb 模拟实现,这些 pcb 公用同一个虚拟地址空间,共享进程中的大部分资源,因此 linux 下线程相对于传统进程更加轻量化,是一个轻量级的进程。

线程的独有与共享

  • 共享:
    同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符,信号处理方式,当前工作路径,用户 id ,组 id 等等。
  • 独有:
    同一进程中的多个线程有各自的调用栈,自己的寄存器环境,自己的线程本地存储,自己的运行序列,信号屏蔽字,errno,线程标识符,优先级。

线程与进程的比较

进程

  • 进程是资源竞争的基本单位。
  • 进程是资源分配的基本单位,所有与该进程有关的资源,都被记录在进程控制块PCB中,以表示该进程拥有这些资源或正在使用它们。
  • 进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间,当进程发生调度时,不同的进程拥有不同的虚拟地址空间。

线程

  • 线程是程序执行的最⼩单位。
  • 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源,但也拥有⾃自己的一部分数据。
  • 线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成,寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。
  • 进程的多个线程共享同一地址空间,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,各线程还共享以下进程资源和环境: 文件描述符表,每种信号的处理方式,当前工作目录,用户 id 和组 id。

线程与进程的区别

  1. 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
  2. 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
  3. 调度和切换:线程上下文切换比进程上下文切换要快得多。
  4. 在多线程OS中,进程不是一个可执行的实体。
  5. 线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。线程具有就绪、阻塞和运行三种基本状态。
  6. 在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度。
  7. 线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。
  8. 进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但必须小心,确保它们不会妨碍同一进程里的其它线程。

线程状态变化

  • 创建线程
    当创建一个新的进程时,也创建一个新的线程,进程中的线程可以在同一进程中创建新的线程。
  • 终止线程
    可以正常终止自己,也可能某个线程执行错误,由其它线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈。
  • 阻塞线程
    当线程等待每个事件无法运行时,停止其运行。
  • 唤醒线程
    当阻塞线程的事件发生时,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。进程仍然具有与执行相关的状态。例如,所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。

线程的优缺点

优点
  • 创建一个新线程的代价要比创建一个新进程小得多
  • 线程之间的切换需要操作系统做的工作要比进程之间的切换少很多
  • 线程占用的资源要比进程少很多
  • 线程能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现 I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作
  • 由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
缺点
  • 性能损失
    一个很少被外部事件阻塞的计算密集型线程往往无法与其 它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低
    编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差,或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说,线程之间是缺乏保护的。
  • 缺乏访问控制
    进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
  • 编程难度提高
    编写与调试一个多线程程序比单线程程序困难得多
发布了71 篇原创文章 · 获赞 131 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43239560/article/details/100121207
今日推荐