操作系统(6)—— 线程(Thread)

一、为什么使用线程

单进程的问题:各个函数之间不是并发执行,影响资源的使用效率。

多进程的问题:进程之间如何通信,共享数据?另外,维护进程的系统开销比较大。

创建进程时,分配资源,建立PCB;撤销进程时,回收资源,撤销PCB;进程切换时,保存当前进程的状态信息。

解决方法

需要提出一种新的实体,满足以下特性:

  • 实体之间可以并发的执行;
  • 实体之间可以共享相同的地址空间。

二、什么是线程

1. 线程(Thread):进程当中的一条执行流程。

从两个方面来重新理解进程:

  • 资源组合的角度看:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段、数据段)、打开的文件等各种资源;
  • 运行的角度看:代码在这个资源平台上的一条执行流程。

线程 = 进程 — 共享资源

2. 线程的优缺点

优点:

  • 一个进程中可以同时存在多个线程;
  • 各个线程之间可以并发的执行;
  • 各个线程之间可以共享地址空间和文件等资源。

缺点:

  • 一个进程崩溃,会导致其所属进程的所有线程崩溃。

三、进程和线程的比较

  • 进程是资源分配单位,线程是CPU调度单位
  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;
  • 线程具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系;
  • 线程能减少并发执行的时间和空间开销
    • 线程的创建时间比进程短;
    • 线程的终止时间比进程短;
    • 同一进程内的线程切换时间比进程短;
    • 由于统一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信。

四、线程的实现

主要有三种线程的实现方式:

  • 用户线程:在用户空间实现(POSIX Pthread、Solaris threads)
  • 内核线程:在内核中实现(Linux、Windows、Solaris);
  • 轻量级进程:在内核中实现,支持用户线程(Solaris)。

用户线程与内核线程的对应关系:多对一/ 一对一/ 多对多

1. 用户线程

在用户空间实现的线程机制,不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。

  • 由于用户线程的维护由相应进程来完成(通过线程库函数),不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;
  • 每个进程都需要它自己私有的线程控制块(TCB,Thread Control Block)列表,用来跟踪记录它的各个线程的状态信息(PC、栈指针、寄存器等),TCB由线程库函数来维护;
  • 用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;
  • 允许每个进程拥有自定义的线程调度算法。

用户线程缺点:

  • 阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待;
  • 当一个线程开始运行后,除非它主动的交出CPU使用权,否则它所在的进程当中的其他线程将无法运行;
  • 由于时间片分配给进程,故与其他进程比,在多线程执行时,每个线程得到的时间片较少,执行会较慢。
2. 内核线程

在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理。

  • 在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB);
  • 线程的创建、终止和切换都是通过系统调用/内核函数的方式来进行,由内核来完成,因此系统开销很大
  • 在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;
  • 时间片分配给线程,多线程的进程获得更多CPU时间;
  • Windows NT 和 Windows 2000/XP支持内核线程。
3. 轻量级进程

内核支持的用户线程。一个进程可有一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持。

你可能感兴趣的:(操作系统)