第 4章 线程
? 线程的引入
? 线程与进程的对比
? 线程的实现
1、线程的引入
进程的两个基本属性,
? 资源的拥有者,
给每个进程分配一虚拟地址空间,保存进
程映像,控制一些资源(文件,I/O设
备),有状态、优先级、调度
? 调度单位,
进程是一个执行轨迹
以上两个属性构成进程并发执行的基础
线程的引入(续)
系统必须完成的操作,
? 创建进程
? 撤消进程
? 进程切换
缺点,
时间空间开销大,限制并发度的提高
线程的引入(续)
? 在操作系统中,进程的引入提高了计算
机资源的利用效率。但在进一步提高进
程的并发性时,人们发现进程切换开销
占的比重越来越大,同时进程间通信的
效率也受到限制
? 线程的引入正是为了简化进程间的通信,
以小的开销来提高进程内的并发程度
线程的引入(续)
线程,有时称轻量级进程
进程中的一个运行实体
是一个 CPU调度单位
资源的拥有者还是进程或称任务
线程的引入(续)
线程,
? 有执行状态(状态转换)
? 不运行时保存上下文
? 有一个执行栈
? 有一些局部变量的静态存储
? 可存取所在进程的内存和其他资源
? 可以创建、撤消另一个线程
线程和进程,
单进程、单线程
单进程、多线程
多进程、一个进程一个线程
多进程、一个进程多个线程
P C B 用 户
栈
单线程进程模型
用户地址空间
核
心
栈
线程控制块,
包含了寄存器映像,线程优先数和线程状态信息
P C B
多线程进程模型
用户
地址
空间
用
户
栈
核
心
栈
线程
控制块
用
户
栈
核
心
栈
线程
控制块
用
户
栈
核
心
栈
线程
控制块
引入线程的好处,
? 创建一个新线程花费时间少(结束亦如此)
? 两个线程的切换花费时间少
(如果机器设有, 存储 [恢复 ]所有寄存器,
指令,则整个切换过程用几条指令即可完
成)
? 同一进程内的线程共享内存和文件,它们
之间相互通信无须调用内核
? 适合多处理机系统
例 1,
LAN中的一个文件服务器,在一段时间内需
要处理几个文件请求
方法:为每一个请求创建一个线程
在一个 SMP机器上:多个线程可以同时在不
同的处理器上运行
例 2,
一个线程显示菜单,并读入用户输入;
另一个线程执行用户命令
一个应用:由几个独立部分组成,这几个
部分不需要顺序执行,则每个部分可以
以线程方式实现
当一个线程因 I/O阻塞时,可以切换到同一
应用的另一个线程
2 线程与进程的比较
? 调度
? 并发性
? 拥有资源
? 系统开销
3 线程的实现机制
? 用户级线程
? 核心级线程
? 两者结合方法
(1)用户级线程( User Level Thread)
? 由应用程序完成所有线程的管理
? 核心不知道线程的存在
? 线程切换不需要核心态特权
? 调度是应用特定的
对用户级线程的核心活动
? 核心不知道线程的活动,但仍然管理线程
的进程的活动
? 当线程调用系统调用时,整个进程阻塞
? 但对线程库来说,线程仍然是运行状态
即线程状态是与进程状态独立的
用户级线程的优点和缺点
优点,
? 线程切换不调用核心
? 调度是应用程序特定的:可以选择最好的算法
? ULT可运行在任何操作系统上(只需要线程库)
缺点,
? 大多数系统调用是阻塞的,因此核心阻塞进程,
故进程中所有线程将被阻塞
? 核心只将处理器分配给进程,同一进程中的两个
线程不能同时运行于两个处理器上
(2)核心级线程( KLT)
? 所有线程管理由核心完成
? 没有线程库,但对核心线程工具提供 API
? 核心维护进程和线程的上下文
? 线程之间的切换需要核心支持
? 以线程为基础进行调度
? 例子,Windows NT,OS/2
核心级线程的优点和缺点
优点,
? 对多处理器,核心可以同时调度同一进程
的多个线程
? 阻塞是在线程一级完成
? 核心例程是多线程的
缺点,
? 在同一进程内的线程切换调用内核,导致
速度下降
(3)两者分析
? 针对不同的操作系统
? 开销和性能( 线程的调度和切换速度 )
? 系统调用
? 线程执行时间
? 灵活性
? 可扩充性
? 抢占 CPU
? 共享进程的资源
(4)ULT和 KLT结合方法
? 线程创建在用户空间完成
? 大量线程调度和同步在用户空间完成
? 程序员可以调整 KLT的数量
? 可以取两者中最好的
线程库
由操作系统或某些语言提供,供所有用户
应用程序共享,并支持用户应用程序创建,
调度和管理自己的用户级线程。
(应用程序中用户级线程的微内核)
至少需提供以下功能的过程调用,
建立线程、撤消线程、阻塞线程、挂起线
程、恢复线程、调度线程、线程间通讯原
语、线程间同步原语
WINDOWS2000/XP线程
1、进程特点,
? 进程是资源分配的基本单位,是作为对象进行
管理的
? 一个可执行的进程可能包含一个或多个线程
? WIN32进程控制系统调用有,CreateProcess、
ExitProcess和 TerminateProcess等
2、进程对象
? 每个进程由许多属性定义,并且封装了它可以执行的
许多动作或服务
进程
进程 ID
安全描述符
基本优先级
默认处理器仿射
定额限制
执行时间
I/O计数器
异常 /调试端口
退出状态
创建进程
打开进程
查询进程信息
设置进程信息
当前进程
终止进程
对象类型
对象体属性
服务
3、线程对象 线程
线程 ID
动态优先级
基本优先级
线程处理器仿射
线程执行
警告状态
挂起计数器
假冒标志
终止端口
线程退出状态
创建线程
打开线程
查询线程信息
设置线程信息
当前线程
终止线程
获得上下文
设置上下文
挂起
恢复
警告线程
测试线程警告
寄存器终止端口
对象类型
对象体属性
服务
4、线程状态
备用
就绪 运行
转换 等待 终止
可运行
选择
运行
资源
可用
解除阻塞 /恢复
资源可用
阻塞 /挂起 终止
解除阻塞
资源不可用
不可运行
切换
剥夺
? 线程的引入
? 线程与进程的对比
? 线程的实现
1、线程的引入
进程的两个基本属性,
? 资源的拥有者,
给每个进程分配一虚拟地址空间,保存进
程映像,控制一些资源(文件,I/O设
备),有状态、优先级、调度
? 调度单位,
进程是一个执行轨迹
以上两个属性构成进程并发执行的基础
线程的引入(续)
系统必须完成的操作,
? 创建进程
? 撤消进程
? 进程切换
缺点,
时间空间开销大,限制并发度的提高
线程的引入(续)
? 在操作系统中,进程的引入提高了计算
机资源的利用效率。但在进一步提高进
程的并发性时,人们发现进程切换开销
占的比重越来越大,同时进程间通信的
效率也受到限制
? 线程的引入正是为了简化进程间的通信,
以小的开销来提高进程内的并发程度
线程的引入(续)
线程,有时称轻量级进程
进程中的一个运行实体
是一个 CPU调度单位
资源的拥有者还是进程或称任务
线程的引入(续)
线程,
? 有执行状态(状态转换)
? 不运行时保存上下文
? 有一个执行栈
? 有一些局部变量的静态存储
? 可存取所在进程的内存和其他资源
? 可以创建、撤消另一个线程
线程和进程,
单进程、单线程
单进程、多线程
多进程、一个进程一个线程
多进程、一个进程多个线程
P C B 用 户
栈
单线程进程模型
用户地址空间
核
心
栈
线程控制块,
包含了寄存器映像,线程优先数和线程状态信息
P C B
多线程进程模型
用户
地址
空间
用
户
栈
核
心
栈
线程
控制块
用
户
栈
核
心
栈
线程
控制块
用
户
栈
核
心
栈
线程
控制块
引入线程的好处,
? 创建一个新线程花费时间少(结束亦如此)
? 两个线程的切换花费时间少
(如果机器设有, 存储 [恢复 ]所有寄存器,
指令,则整个切换过程用几条指令即可完
成)
? 同一进程内的线程共享内存和文件,它们
之间相互通信无须调用内核
? 适合多处理机系统
例 1,
LAN中的一个文件服务器,在一段时间内需
要处理几个文件请求
方法:为每一个请求创建一个线程
在一个 SMP机器上:多个线程可以同时在不
同的处理器上运行
例 2,
一个线程显示菜单,并读入用户输入;
另一个线程执行用户命令
一个应用:由几个独立部分组成,这几个
部分不需要顺序执行,则每个部分可以
以线程方式实现
当一个线程因 I/O阻塞时,可以切换到同一
应用的另一个线程
2 线程与进程的比较
? 调度
? 并发性
? 拥有资源
? 系统开销
3 线程的实现机制
? 用户级线程
? 核心级线程
? 两者结合方法
(1)用户级线程( User Level Thread)
? 由应用程序完成所有线程的管理
? 核心不知道线程的存在
? 线程切换不需要核心态特权
? 调度是应用特定的
对用户级线程的核心活动
? 核心不知道线程的活动,但仍然管理线程
的进程的活动
? 当线程调用系统调用时,整个进程阻塞
? 但对线程库来说,线程仍然是运行状态
即线程状态是与进程状态独立的
用户级线程的优点和缺点
优点,
? 线程切换不调用核心
? 调度是应用程序特定的:可以选择最好的算法
? ULT可运行在任何操作系统上(只需要线程库)
缺点,
? 大多数系统调用是阻塞的,因此核心阻塞进程,
故进程中所有线程将被阻塞
? 核心只将处理器分配给进程,同一进程中的两个
线程不能同时运行于两个处理器上
(2)核心级线程( KLT)
? 所有线程管理由核心完成
? 没有线程库,但对核心线程工具提供 API
? 核心维护进程和线程的上下文
? 线程之间的切换需要核心支持
? 以线程为基础进行调度
? 例子,Windows NT,OS/2
核心级线程的优点和缺点
优点,
? 对多处理器,核心可以同时调度同一进程
的多个线程
? 阻塞是在线程一级完成
? 核心例程是多线程的
缺点,
? 在同一进程内的线程切换调用内核,导致
速度下降
(3)两者分析
? 针对不同的操作系统
? 开销和性能( 线程的调度和切换速度 )
? 系统调用
? 线程执行时间
? 灵活性
? 可扩充性
? 抢占 CPU
? 共享进程的资源
(4)ULT和 KLT结合方法
? 线程创建在用户空间完成
? 大量线程调度和同步在用户空间完成
? 程序员可以调整 KLT的数量
? 可以取两者中最好的
线程库
由操作系统或某些语言提供,供所有用户
应用程序共享,并支持用户应用程序创建,
调度和管理自己的用户级线程。
(应用程序中用户级线程的微内核)
至少需提供以下功能的过程调用,
建立线程、撤消线程、阻塞线程、挂起线
程、恢复线程、调度线程、线程间通讯原
语、线程间同步原语
WINDOWS2000/XP线程
1、进程特点,
? 进程是资源分配的基本单位,是作为对象进行
管理的
? 一个可执行的进程可能包含一个或多个线程
? WIN32进程控制系统调用有,CreateProcess、
ExitProcess和 TerminateProcess等
2、进程对象
? 每个进程由许多属性定义,并且封装了它可以执行的
许多动作或服务
进程
进程 ID
安全描述符
基本优先级
默认处理器仿射
定额限制
执行时间
I/O计数器
异常 /调试端口
退出状态
创建进程
打开进程
查询进程信息
设置进程信息
当前进程
终止进程
对象类型
对象体属性
服务
3、线程对象 线程
线程 ID
动态优先级
基本优先级
线程处理器仿射
线程执行
警告状态
挂起计数器
假冒标志
终止端口
线程退出状态
创建线程
打开线程
查询线程信息
设置线程信息
当前线程
终止线程
获得上下文
设置上下文
挂起
恢复
警告线程
测试线程警告
寄存器终止端口
对象类型
对象体属性
服务
4、线程状态
备用
就绪 运行
转换 等待 终止
可运行
选择
运行
资源
可用
解除阻塞 /恢复
资源可用
阻塞 /挂起 终止
解除阻塞
资源不可用
不可运行
切换
剥夺