进程的控制与描述——线程
线程的引入
1、引入进程的目的
使多个程序能并发执行,提高资源利用率和系统吞吐量。
2、引入线程的目的
应用的需要/ 开销的考虑/ 性能的提升
线程的基本概念
线程的概念
线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程 。
进程中的一个相对独立的、可调度的执行单元。
进程与线程的区别
进程是资源分配单位
线程是CPU执行单位
多线程优点
切换速度快(地址空间不变)
系统开销小
通讯容易(共享数据空间)
线程的内存布局
每个线程拥有自己的栈:局部变量和返回地址
线程控制块
TCB(Thread control block):
标志线程存在的数据结构, 其中包含对线程管理需要的全部信息.
内容:
线程标识、线程状态
调度参数、现场(通用寄存器,PC,SP)
存放位置:
用户级线程:目态空间
核心级线程:管态空间
线程的属性
1、轻型实体:只有一点必不可少的、能保证独立运行的资源
2、CPU调度的基本单位
3、可并发执行
4、共享进程资源
(并发性、共享性、动态性)
线程的优点
1、快速切换;
2、易于通信;
3、并行度高;
4、节省内存;
5、减少管理开销。
线程的基本状态
三基态:执行状态、就绪状态、阻塞状态
线程的创建和终止
线程的创建:
利用线程创建函数(或系统调用);
创建成功后,返回一个线程标识符。
线程的终止方式:
自愿退出
被其它线程强行终止
线程与进程的比较
线程:作为CPU调度单位。
线程只拥有必不可少的资源,如:线程状态、寄存器上下文和栈
同样具有就绪、阻塞和执行三种基本状态
进程:其它资源分配单位(存储器、文件、IO等)。
调度:线程作为CPU调度的基本单位,而进程只作为其它资源分配单位。
并发性:进程之间可以并发,且一个进程的多个线程之间亦可并发。
拥有资源:进程间相互独立,同一进程的各线程间共享资源。某进程内的线程在其它进程不可见。
系统开销:线程上下文切换比进程上下文切换要快得多。
线程的实现及控制
用户级线程(User-level thread)
一、线程库
提供线程运行管理系统:
创建、撤消线程
在线程之间传递消息和数据
调度线程执行
保护和恢复线程上下文
二、
实现方法:
- 基于library函数,系统不可见
- 线程创建、撤销、状态转换在目态完成
- TCB在用户空间,每个进程一个系统栈
优点:
- 不依赖于操作系统,调度灵活
- 切换无须从目态到管态,速度快
- ULT可运行在任何操作系统上(只需要线程库),可以在一个不支持线程的OS上实现
缺点:
- 核心只将处理器分配给进程,在多处理机中同一进程中多个线程不能真正并行
- 一个线程进入系统受阻,进程中其它线程不能执行
核心级线程(Kernel-level thread)
一、
所有线程管理由核心完成
没有线程库,但核心提供API
核心维护进程和线程的上下文
线程之间的切换需要核心支持
以线程为基础进行调度
二、
实现方法:
- 基于系统调用
- 创建、撤销、状态转换由操作系统完成
优点:
- 对多处理器,核心可以同时调度同一进程的多个线程
- 某线程阻塞,其它线程仍可执行
缺点:
- 应用程序线程在用户态运行,而线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要用户态-内核态-用户态的模式切换,系统开销较大。
- 调度算法不能灵活控制
混合线程(Hybrid approach)
混合式中,一个应用中的多个线程能同时在多处理器上并行运行,且阻塞一个线程时并不需要封锁整个进程。如果设计得当,混合式多线程机制能够结合了两者优点,舍去缺点。
用户级线程和核心级线程的区别
用户级线程(ULT) | 核心级线程(KLT) | |
---|---|---|
管理 | 线程库 | 内核 |
调度单位 | 进程 | 线程 |
切换速度 | 同一进程 线程间切换,由线程库完成,速度较快 | 由内核完成,速度较慢 |
系统调用行为 | 内核看做是整个用户进程的行为 | 内核只看做该线程的行为 |
阻塞 | 用户进程 | 线程 |
优点 | 线程切换不调用内核,切换速度较快,调度算法可由应用程序定 | 对多处理器,可同时调度同一进程的多个线程,速度较快,阻塞是在线程一级 |
缺点 | 阻塞在用户进程一级 | 同一进程内的线程切换速度较慢 |
测试
1、同一进程中的多个线程有哪些成分是共用的,哪些成分是私用的?
答:
线程的公有成分包括:代码区、数据区、动态堆空间。
线程的私有成分包括:线程控制块; 一个执行栈;运行时动态分给线程的寄存器。
2、如果信号量的当前值为-4,则表示:系统中在该信号量上有4个等待进程。
3、在操作系统中,不可中断的操作称为:原语
4、用户级线程和内核支持线程有何区别?
解答:
(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。
(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。
(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。