线程

操作系统中,进程的引入提高了计算机资源的利用效率。但在进一步提高进程的并发性时,人们发现进程切换开销占的比重越来越大;此外,传统的进程不能很好的利用多处理器,因为一个进程在某个时刻只能使用一个处理器;进程间通信的效率受到限制。

「进程」是操作系统中除处理器外进行资源分配和保护的基本单位。它有虚拟地址空间,容纳进程映像,并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程。

与进程相比,「线程」是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的
基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的实体(控制流),这就是多线程。

可见,线程是比进程更小的概念,专注于「处理器调度」部分。

img-2024-05-17 15-52-42.png

线程运行在进程的上下文中,并使用进程的资源和环境。系统调度的基本单位是线程而不是进程,每当创建一个进程时,至少要同时为该进程创建一个线程。

组成

数据结构

  1. 线程唯一标识符及线程状态信(运行态、就绪态、阻塞态和终止态);
  2. 线程是一条执行路径,有独立的程序计数器;未运行时保护线程上下文。
  3. 线程有执行栈和存放局部变量的私用存储空间。
  4. 可访问所属进程的内存和资源,并与该进程中的其他线程共享这些资源。

线程状态

  • 线程状态有:运行、就绪、等待和终止,状态转换也类似于进程。
  • 挂起状态对线程是没有意义,如果进程挂起后被对换出主存,则它的所有线程因共享进程的地址空间,也必须全部对换出去。

实现

从实现角度看,线程分为用户级线程内核级线程

比较用户级进程和内核级进程:(往年经常考,频率非常高,50%以上,简答题)

  • 调度和切换速度:ULT 切换快, KLT 切换与进程切换相似。ULT 通常发生在一个应用进程的诸线程中,无需通过中断进入内核。
  • 系统调用:ULT 进行系统调用时,会引起进程的阻塞;KLT 进行系统调用时只会引起该线程阻塞。
  • 线程执行时间:ULT 以进程为单位调度,KLT 以线程为单位调度。
    • ULT:进程 A 有 1 个线程,进程 B 有 100 个线程,则 A 的线程比 B 快
    • KLT:进程 A 有1个线程,进程 B 有100 个线程,则 B 比 A 快
  • 使用范围:ULT 广,任何 OS, KLT 需 OS 内核支持
  • 调度算法:ULT 与 OS 调度算法无关,可针对应用优化
  • 多处理器支持:KLT 可充分利用多处理器