进程与线程
进程的引入
- 为什么引入进程?
- 为了描述多道程序的并发执行,引入了进程的概念,通过进程管理多道程序之间的关系,可以解决对处理机的调度分配以及回收等问题。
- 单道程序的顺序执行:
- 程序可以理解为一个时间上按严格次序先后操作的序列。
- 程序的顺序执行的特征
- 顺序性:程序的执行严格规定的顺序执行
- 封闭性:程序在封闭的环境下运行,程序在执行时独占系统资源
- 可再现性:程序在执行时,只要初始条件一样,则结果必然一样
- 程序并发执行的特征
- 间断性(参考第一章多道程序的微观串行性)
- 失去封闭性
- 失去可再现性
- 程序并发执行的条件
- R(P1) ∩ W(P2) U R(P2) ∩ W(P1) U W(P1) ∩ W(P2)={};
- 对于同一未加保护的数据执行读写、写读、写写操作违反Bernstein条件(程序并发执行的条件)
- 进程的概念
- 一个进程就是正在执行的程序。进程可以定义为并发执行的程序在一个数据集合上的执行过程。
- 进程是一个可以拥有资源的独立单位。
- 进程是一个可以独立调度和分派的基本单位。
- 进程跟程序的关系
- 进程
- 动态性、并发性、暂时性。
- 结构特征:由程序、数据、PCB 组成。
- 程序
- 静态性、 顺序性、永久性。
- 进程与程序密切相关。一个程序可以包含很多个进程。
进程的状态及组成
- 进程的三种基本状态
- 运行状态(进程占据CPU)
- 就绪状态(进程已经获得除CPU的所有必要资源)
- 阻塞状态(当进程由于等待某个I/O或同步事件暂停运行)
- 进程三种基本状态的转换
graph LR
A[就绪]-->|程序调度|B[运行]
B-->|I/O资源被占用......|C[阻塞]
B-->|时间片用完|A
C-->|阻塞的原因被解除|A
- 进程的创建以及退出状态
- 创建状态:被创建的进程进入就绪队列
- 退出状态:当进程完成了预期任务或者异常终止,进程转化为退出态
- 进程五种状态的转换
graph LR
A[就绪]-->|程序调度|B[运行]
B-->|I/O资源被占用......|C[阻塞]
B-->|时间片用完|A
C-->|阻塞的原因被解除|A
D[创建状态]-->|接纳|A
B-->|完成预期任务......|E[退出状态]
- 进程的挂起状态
- 内外存对换紧张
- 程序调试需要
- 实时系统的负载需要
graph LR
A[就绪]-->|程序调度|B[运行]
B-->|I/O资源被占用......|C[阻塞]
B-->|时间片用完|A
C-->|阻塞的原因被解除|A
D[创建状态]-->|接纳|A
B-->|完成预期任务......|E[退出状态]
B-->|抢占式系统可能发生|F[就绪挂起]
C-->G[阻塞挂起]
A-->|挂起|F
F-->|激活|A
G-->|激活|C
G-->|I/O事件完成|F
- 进程控制块(PCB)
- 进程映像:需要一个数据结构来描述进程本身的特性、进程的状态、进程的调度信息、对资源的占有。
- 进程映像由PCB、数据、程序、栈组成。
- 作用:使一个在多道程序的环境下不能独立运行的程序成为一个独立运行的基本单位。系统总是通过访问PCB来感知进程的存在。
- PCB中的内容
- 进程描述信息
- 进程名、进程标识符、用户名
- 进程控制和资源占用信息
- 程序入口地址、程序外存地址、进程同步以及通信机制、资源占用信息、链接指针
- 进程调度信息
- 进程状态、进程优先级、运行统计信息、进程阻塞原因
- 处理机状态信息
- 通用寄存器、指令计数器、程序状态字、栈指针
- PCB的组织
- 把许多具有相同状态的PCB链接在一起
进程控制
- 核心态以及用户态:为了防止操作系统及其关键数据结构被用户无意或者有意篡改。将处理机的执行状态分为核心态以及用户态
- 内核:与硬件紧密相关,且这部分程序必须常驻内存以提高操作系统的运行效率,这部分程序通常称作内核
- 原语:许多指令构成的,完成一定功能的过程,由原子操作完成
- 进程家族树:父进程撤销,则其下面所有进程全部撤销
- 进程的创建以及撤销
- 进程创建:应用请求、提供服务......
- 创建原语:
- 申请空白PCB
- 初始化进程信息
- 为进程分配资源
- 将新进程插入就绪队列
- 进程的撤销:
- 撤销原语:
- 查找需要撤销进程的PCB
- 若进程处于运行则终止,并重新调度程序运行
- 若进程有子孙,则终止所有子孙进程
- 归还资源
- 从所在的队列移除
- 进程的阻塞以及唤醒
- 阻塞原语:
- 停止执行的进程
- 将进程插入阻塞队列
- 重新调度
- 唤醒原语:
- 将进程解下阻塞队列
- 把进程插入就绪队列
- 改变进程的PCB的状态
- 进程的挂起与激活:
- 挂起原语:
- 检测被挂起进程的状态
- 若进程处于就绪态,则变为就绪挂起状态
- 若进程处于阻塞状态,则变为阻塞挂起状态
- 若进程正在运行,则将进程转为就绪挂起态
- 激活原语:
- 检查被激活进程的状态
- 若进程处于就绪挂起,则变为就绪态
- 若进程处于阻塞态,则变为阻塞态
- 若系统采用的是抢占式进程调度
- 线程
- 线程:比进程更小、能独立运行的基本单位
- 多线程的优点:响应度高、资源共享、经济
- 线程是进程的一个实体,是被独立调度和分派的单位
- 线程又称轻型进程(LWP)
为了提高进程的并发度,同时减少系统的开销。操作系统学者把进程的两个基本属性分开。
既进程作为独立分配资源的单位,不在作为调度以及分派的基本单位
- 线程的组成
- TCB(线程控制块)
- 线程标识符
- 描述处理机状态信息的一组寄存器
- 栈指针(用户栈/核心栈)
- 私有存储区
- 线程的状态
- 参考进程
- 线程的控制
- 线程创建
- 线程的撤销
- 线程的等待
- 线程让权(自愿放弃CPU)
- 单线程进程模型
- PCB、用户地址空间、用户栈、内核栈
- 多线程进程模型
- PCB
- 用户地址空间
- 多个(TCB、用户栈、内核栈)
- 引入线程的必要性
- 创建一个线程比进程所需的时间少
- 撤销一个线程比撤销进程花费的时间少
- 线程之间的切换比进程之间切换花费的时间少
- 线程提高了不同执行程序之间的通信效率
- 线程的实现
- 用户线程(由应用程序完成,不依赖内核)
- 内核级线程(依赖内核)
- 用户级线程的优点
- 线程切换状态不需要系统状态的转换
- 每个进程可以使用专门的调度算法来调度线程
- 用户级线程可以在任何操作系统运行而不需要操作系统支持
- 内核级线程的优点
- 在多处理机的环境中,可以把一个进程的多个线程分配到多个CPU上。
- 如果进程中某个线程被阻塞,内核可以调度一个进程的另一个线程
- 内核级线程本身可以被设置成为多线程
- 组合方法
- solaris操作系统使用内核级、用户级线程共同使用。
- 多线程问题:
- 线程取消
- 立即取消:线程不需要时立即取消
- 延迟取消:被取消的线程不断检查它是否应被终止,以一种有序的方式终结自己。