Appearance
2.6 线程
一、进程回顾
进程的两个基本属性:
拥有资源的独立单位:一个进程包括一个保存进程映像的虚地址空间,拥有对资源的控制或所有权。
调度/执行的基本单位:一个具有状态和优先级,可被操作系统调度并分派的实体。
这两个部分是独立的,OS应该能够独立的处理它们,为此可引入线程。
二、进程与线程
1. 线程的诞生
为区分这两个特点,调度并分派的单位通常称为线程或轻量级进程(LWP),而资源所有权的单位通常称为进程。
传统的每个进程中只有一个线程在执行(没有考虑线程的概念),称作单线程进程。
线程是进程中的一个实体,是独立调度和分派的基本单位。
2. 单线程和多线程模式
3. 进程与线程的比较
概念
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
线程是进程中的一个实体,是独立调度和分派的基本单位。
拥有资源
进程,拥有资源的单位。容纳进程映像的地址空间、全局变量、打开文件、I/O设备等。
线程,拥有少量私有资源。线程控制块(含PC、寄存器、线程状态等信息)、栈等。
同一进程内的线程共享进程的全部资源。
调度
传统操作系统
- 拥有资源的基本单位——进程
- 独立调度的基本单位——进程
引入线程的操作系统
- 拥有资源的基本单位——进程
- 独立调度的基本单位——线程
- 提高了系统的并发程度,why?
线程切换
- 同一进程中的线程间切换,不会引起进程切换
- 不同进程中的线程切换,将引起进程切换。
并发性
进程之间,存在并发
同一进程的多个线程之间,亦存在并发
引入线程的操作系统具有更好的并发性,能更有效地使用系统资源和提高系统吞吐量。为什么?
答:1线程的创建、结束比进程快2同一个进程内的不同线程间切换比不同进程间切换快得多3线程间通信比进程间通信快得多
系统开销(与进程相比,线程优点)
创建、撤销进程的开销大于创建、撤销线程的开销
同一进程内线程切换的开销,小于进程切换开销
同一进程间的多个线程同步和通信较容易,因为具有相同的地址空间
有些类型的线程切换、同步和通信无需操作系统内核的干预
三、多线程并发
1. 线程的基本状态
就绪状态
执行状态
阻塞状态
线程一般不具有挂起状态。
2. 线程的基本操作
一个进程可以创建和撤消一个或多个线程,同一进程中的多个线程可并发执行。
派生(Spawn)
- 系统创建进程时,同时也为该进程派生一个线程
- 同一进程中的线程可以再派生其它线程
阻塞(Block)
- 等待某事件时,释放处理机
解除阻塞(Unblock)
- 事件发生,状态变成就绪,插入就绪队列,等待调度执行
结束(Finish)
- 线程执行完毕,释放其私有资源
四、线程的类型
线程类型:依据线程是否对内核透明
1. 用户级线程
线程的创建、撤销和切换等操作全部由应用程序完成。
操作系统内核不知道线程的存在,仍以进程为调度单位。
nfomix支持用户级线程。
优点
线程的管理和控制仅在用户级进行,切换开销小。
调度更灵活。
线程库独立于系统内核。
缺点
用户级线程中的系统调用常常会引起线程及整个进程阻塞,削弱了线程的并发性。
同一进程中的多线程无法利用多处理器技术。
2. 内核级线程
线程的创建、撤销和切换等操作由系统内核完成。
内核级线程又称为轻量级进程LWP(Light Weight Process)。
操作系统以线程为调度单位。
Windows 2000/XP、Linux和OS/2等操作系统采用了内核级线程技术。
优点
内核可以同时把同一个进程的多个线程调度到多个处理器。
如果进程中的一个线程被阻塞(包括页面故障),内核可以调度同一进程中的其他线程。
内核例程也可以是多线程的。
缺点
相对于用户级线程而言,模式切换开销大。
线程调度管理需在内核中完成,如创建、撤销、切换等。
3. 混合线程
线程的创建、撤销、调度和同步等操作在用户级应用程序中完成。
多个用户级线程被影射到一个或较少的某些内核级线程。
Solaris操作系统采用了混合线程模式。
4. 用户级、内核级、混合线程模式的比较
五、Posix线程
线程调用 | 描述 |
---|---|
Pthread_create | 创建一个线程 |
Pthread_exit | 结束调用的线程 |
Pthread_join | 等待一个特定的线程退出 |
Pthread_yield | 释放CPU来运行另外一个线程 |
Pthread_attr_init | 创建并初始化一个线程的属性结构 |
Pthread_attr_destroy | 删除一个线程的属性结构 |