初识线程
线程的概念
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
定义与基本特征
- 轻量级实体:线程是比进程更小的可独立运行的基本单位,也被称为轻量级进程。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但每个线程都有自己独立的程序计数器、寄存器和栈等。
- 并发执行:同一进程内的多个线程可以并发执行,操作系统会为每个线程分配 CPU 时间片,使得它们在宏观上看起来是同时运行的。通过这种方式,线程可以实现程序的并发处理,提高系统资源的利用率和程序的执行效率。
- 共享与独立:线程可以共享进程的大部分资源,这使得线程之间的通信和数据共享相对容易实现。同时,每个线程又有自己独立的执行路径和上下文,能够独立地进行运算调度,互不干扰。
线程的状态
- 就绪状态:线程已经具备了运行的条件,等待操作系统分配 CPU 资源,一旦获得 CPU 时间片,就可以立即执行。
- 运行状态:线程正在 CPU 上执行,正在执行相应的任务代码。
- 阻塞状态:线程因等待某些事件的发生而暂时无法继续执行,比如等待 I/O 操作完成、等待获取锁、等待其他线程的通知等。当所等待的事件发生后,线程会从阻塞状态转换为就绪状态,重新进入就绪队列等待 CPU 调度。
作用与优势
- 提高程序响应性:在图形界面应用程序中,通常会有一个主线程用于处理界面的显示和更新,同时还可以创建其他线程来处理后台任务,如文件读取、网络数据下载等。这样,即使后台任务比较耗时,也不会阻塞主线程,从而保证界面能够及时响应用户的操作,提高用户体验。
- 充分利用多核处理器:在多核处理器的环境下,多个线程可以同时在不同的核心上运行,实现真正的并行处理,从而充分发挥多核处理器的性能优势,提高程序的执行效率。
- 简化程序结构:将一个复杂的任务分解为多个线程来执行,可以使程序的结构更加清晰,每个线程负责一个相对独立的子任务,便于代码的编写、调试和维护。
与进程的关系
- 包含关系:进程是资源分配的基本单位,而线程是进程内的执行单元。一个进程可以包含一个或多个线程,线程是进程的组成部分,不能独立于进程而存在。
- 资源共享与独立:进程拥有独立的地址空间和系统资源,不同进程之间的资源相互隔离。而同一进程内的线程共享进程的资源,但每个线程有自己独立的栈空间和寄存器等。
- 调度与切换:进程的调度和切换相对复杂,需要保存和恢复大量的上下文信息,开销较大。而线程的调度和切换相对简单,因为线程共享进程的资源,所以在切换时只需保存和恢复少量的寄存器等信息,开销较小。
线程的缺点
- 性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与其他线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,因为这里增加了额外的同步和调度的开销,但是可用的资源是不变的。
- 健壮性降低:一个多线程的程序中,多线程共享的资源是占大部分的。如果线程之间时间分配上出现了细微的偏差或者共享了不该共享的变量就很有可能会造成不良影响,所以进程间缺乏保护。
- 线程异常:线程一旦出现除零或野指针这样的错误,导致线程崩溃,进程也会跟着崩溃。
在操作系统中,线程是实现并发编程和提高系统性能的重要手段,广泛应用于各种类型的程序开发中。
为了帮助理解,我们可以将盖大楼的过程类比:土木同学画图纸、建筑工人打地基、吊车工人运送原料等,他们共同在做的是盖大楼,但每个人都在做自己的事情。这些事情是无法分开的,但合起来就是盖楼的一个过程。这就是进程和线程之间的关系,每个人做的工作都是线程,所有人做的工作合起来就是进程。






