Skip to content

2.6 线程

Giovanna

About 1468 wordsAbout 5 min

2024-08-31

一、进程回顾

进程的两个基本属性:

  • 拥有资源的独立单位:一个进程包括一个保存进程映像的虚地址空间,拥有对资源的控制或所有权。

  • 调度/执行的基本单位:一个具有状态和优先级,可被操作系统调度并分派的实体。

这两个部分是独立的,OS应该能够独立的处理它们,为此可引入线程。

二、进程与线程

1. 线程的诞生

为区分这两个特点,调度并分派的单位通常称为线程或轻量级进程(LWP),而资源所有权的单位通常称为进程。

传统的每个进程中只有一个线程在执行(没有考虑线程的概念),称作单线程进程。

线程是进程中的一个实体,是独立调度和分派的基本单位。

image.png

2. 单线程和多线程模式

image.png

3. 进程与线程的比较

概念

  • 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

  • 线程是进程中的一个实体,是独立调度和分派的基本单位。

拥有资源

  • 进程,拥有资源的单位。容纳进程映像的地址空间、全局变量、打开文件、I/O设备等。

  • 线程,拥有少量私有资源。线程控制块(含PC、寄存器、线程状态等信息)、栈等。

  • 同一进程内的线程共享进程的全部资源。

调度

  • 传统操作系统

    • 拥有资源的基本单位——进程
    • 独立调度的基本单位——进程
  • 引入线程的操作系统

    • 拥有资源的基本单位——进程
    • 独立调度的基本单位——线程
    • 提高了系统的并发程度,why?
  • 线程切换

    • 同一进程中的线程间切换,不会引起进程切换
    • 不同进程中的线程切换,将引起进程切换。

并发性

  • 进程之间,存在并发

  • 同一进程的多个线程之间,亦存在并发

引入线程的操作系统具有更好的并发性,能更有效地使用系统资源和提高系统吞吐量。为什么?

答:1线程的创建、结束比进程快2同一个进程内的不同线程间切换比不同进程间切换快得多3线程间通信比进程间通信快得多

系统开销(与进程相比,线程优点)

  • 创建、撤销进程的开销大于创建、撤销线程的开销

  • 同一进程内线程切换的开销,小于进程切换开销

  • 同一进程间的多个线程同步和通信较容易,因为具有相同的地址空间

  • 有些类型的线程切换、同步和通信无需操作系统内核的干预

三、多线程并发

1. 线程的基本状态

  • 就绪状态

  • 执行状态

  • 阻塞状态

线程一般不具有挂起状态。

2. 线程的基本操作

一个进程可以创建和撤消一个或多个线程,同一进程中的多个线程可并发执行。

  • 派生(Spawn)

    • 系统创建进程时,同时也为该进程派生一个线程
    • 同一进程中的线程可以再派生其它线程
  • 阻塞(Block)

    • 等待某事件时,释放处理机
  • 解除阻塞(Unblock)

    • 事件发生,状态变成就绪,插入就绪队列,等待调度执行
  • 结束(Finish)

    • 线程执行完毕,释放其私有资源

四、线程的类型

线程类型:依据线程是否对内核透明

1. 用户级线程

线程的创建、撤销和切换等操作全部由应用程序完成。

操作系统内核不知道线程的存在,仍以进程为调度单位。

nfomix支持用户级线程。

image.png

优点

  • 线程的管理和控制仅在用户级进行,切换开销小。

  • 调度更灵活。

  • 线程库独立于系统内核。

缺点

  • 用户级线程中的系统调用常常会引起线程及整个进程阻塞,削弱了线程的并发性。

  • 同一进程中的多线程无法利用多处理器技术。

2. 内核级线程

线程的创建、撤销和切换等操作由系统内核完成。

内核级线程又称为轻量级进程LWP(Light Weight Process)。

操作系统以线程为调度单位。

Windows 2000/XP、Linux和OS/2等操作系统采用了内核级线程技术。

image.png

优点

  • 内核可以同时把同一个进程的多个线程调度到多个处理器。

  • 如果进程中的一个线程被阻塞(包括页面故障),内核可以调度同一进程中的其他线程。

  • 内核例程也可以是多线程的。

缺点

  • 相对于用户级线程而言,模式切换开销大。

  • 线程调度管理需在内核中完成,如创建、撤销、切换等。

3. 混合线程

线程的创建、撤销、调度和同步等操作在用户级应用程序中完成。

多个用户级线程被影射到一个或较少的某些内核级线程。

Solaris操作系统采用了混合线程模式。

image.png

4. 用户级、内核级、混合线程模式的比较

image.png

五、Posix线程

线程调用描述
Pthread_create创建一个线程
Pthread_exit结束调用的线程
Pthread_join等待一个特定的线程退出
Pthread_yield释放CPU来运行另外一个线程
Pthread_attr_init创建并初始化一个线程的属性结构
Pthread_attr_destroy删除一个线程的属性结构