进程

  • 由于对操作系统多任务处理的需求,出现了进程的抽象概念
  • 进程是对运行中的程序的抽象

线程

  • 由于进程的粒度太大,为了进行更细粒度的控制,出现了线程的概念
  • 线程指程序中的一个指令执行序列,此时进程退化为线程和硬件资源的容器

线程的出现实际上是代码执行(线程)与资源分配(进程)相分离的体现

线程在计算机系统各层次上的实现

  • user thread:由于在用户空间中实现,这种线程的创建和管理的开销更小(不需要上下文切换),但是user thread需要与kernel thread相关联,因此被关联的kernel thread的阻塞会引起相关user thread的阻塞
  • kernel thread:在内核空间中实现,被阻塞的kernel thread可以换出,但是需要上下文切换所以管理开销较大
  • hardware thread:执行某个软件线程的硬件资源
digraph G {
    compound = true

    subgraph "cluster software thread" {
        label = "software thread"

        subgraph "cluster user thread" {
            label = "user thread 定义线程"
            {
                rank = same
                "user thread 1"
                "user thread 2"
                "user thread 3"
            }
        }

        subgraph "cluster kernel thread" {
            label = "kernel thread 调度线程"
            {
                rank = same
                "kernel thread 1" [label = "kernel thread 1(阻塞中)"]
                "kernel thread 2" [label = "kernel thread 2(未阻塞)"]
            }
            "kernel thread 1" -> "kernel thread 2" [label = "context switch"]
        }
    
        "user thread 2":sw -> "kernel thread 1":nw[ltail = "cluster user thread" label = "关联"]
        "kernel thread 1":ne -> "user thread 2":se[lhead = "cluster user thread" label = "全部阻塞"]
    }

    subgraph "cluster hardware thread" {
        label = "hardware thread 执行线程"
        {
            rank = same
            "logic core"
            "hyper-threading"
        }
        {
            rank = same
            "hardware thread 1"
            "hardware thread 2"
            "hardware thread 3"
        }
        
        "logic core" -> "hardware thread 1" [label = "执行"]
        "hyper-threading" -> "hardware thread 2" [label = "执行"]
        "hyper-threading" -> "hardware thread 3" [label = "执行"]
    }

    "kernel thread 2":sw -> "hyper-threading":ne[lhead = "cluster hardware thread" label = "调度到处理器硬件上执行"]
}

user thread 关联到 kernel thread 的映射模型

  • 一对一:对每个user thread创建一个与其关联的kernel thread ,开销大
  • 多对一:一个kernel thread 的阻塞会造成多个user thread的阻塞
  • 多对多:前两种方法的折衷。一种实现方法是在kernel thread和user thread之间引入LWP(light-weight process)数据结构

多进程与多线程的比较

  • 多进程和多线程都可以提高硬件的利用率(the overlapping use of hardware),增强程序的响应性
  • 相比多进程,多线程的开销更小(因为粒度小),多线程可以使用比IPC(进程间通信)更快的共享内存

性能优化思想:通过更细粒度的控制来得到更好的性能