引入
程序的顺序执行(单道程序系统)
特点:顺序性、运行环境的封闭性、程序运行结果可再现性
程序的并发执行(多道程序系统)
特点:间断性、失去封闭性、不可再现性
例1: 下面有四个程序:
P1 : a = x^5
P2 : b = y-1
P3 : c = a-b
P4 : d = c+2
P1 和 P2,P3和P4 能否并发执行?
解:思路:进程的读和写没有交集就能并发执行
W(P1) = {a} ; R(P1) = {x} ; W(P2) = {b} ; R(P2) = {y} ;
W(P3) = {c} ; R(P3) = {a,b} ; W(P4) = {d} ; R(P4) = {c}
W(P1) R(P2) W(P2) R(P1) W(P1) W(P2) = { } P1和P2可以并发执行
W(P3) R(P4) W(P4) R(P3) W(P3) W(P4) = { c } P3和P4不可以并发执行
进程的定义:
- 正在执行中的程序
- 正在计算机上执行的程序实例
- 能分配给处理机并由处理机执行的实体
- 具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集合
- 程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位,也是基本单位(目前,线程才是系统调度的基本单位)
特点:
- 结构特征:每一个进程都有一个进程控制块PCB,是进程存在的标志;进程实体/进程映像:由程序代码、与代码相关联的数据集和PCB
- 动态性:进程有生命周期
- 并发性:一个进程可以与其他进程并发执行(程序不具备并发性)
- 独立性:独立请求并占有资源、独立被调度运行,凡未建立PCB的程序都不能作为一个独立的单位参与运行
- 异步性:进程的推进速度是不可预知的
进程的状态模型
两状态模型
运行态:获得处理机并运行
未运行态:未获得处理机
处于未运行态的进程,系统会按照某种原则组织成一个队列。
三状态模型
就绪态:一个进程获得了除处理机之外所需的一切资源,一旦得到处理机即可运行。处于就绪态的多个进程的PCB组成就绪队列
运行态:正在处理机上运行
阻塞态/等待态:进程因某等待事件发生(如I/O请求、某些原语操作等)而处于暂停运行的状态,即使讲处理机分配给它,它也无法运行。处于阻塞态的多个进程的PCB组成阻塞队列
五状态模型
就绪态:一个进程获得了除处理机之外所需的一切资源,一旦得到处理机即可运行。处于就绪态的多个进程的PCB组成就绪队列
运行态:正在处理机上运行
阻塞态/等待态:进程因某等待事件发生(如I/O请求、某些原语操作等)而处于暂停运行的状态,即使讲处理机分配给它,它也无法运行。处于阻塞态的多个进程的PCB组成阻塞队列
新建态 :刚刚创建的进程,操作系统还未将它加入就绪队列中
退出态:进程被终止但还未释放PCB
七状态模型
运行态:正在处理机上运行
新建态 :刚刚创建的进程,操作系统还未将它加入就绪队列中
退出态:进程被终止但还未释放PCB
活动就绪态:进程在内存中并可以被调度执行
活动阻塞态:进程在内存中并等待某事件的发生
静止阻塞态:进程在外存中并等待某事件的发生
静止就绪态:进程在外存中,但是只要被调入内存就可以被调度执行
PCB的作用:使一个在多道程序环境中不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
PCB是进程存在的唯一标志。
PCB的内容:
进程标识信息 |
处理机状态信息 |
进程调度信息 |
进程控制信息 |
进程标识信息:系统识别进程的唯一标志,包含本进程的标识符(外部标识符——进程创建者——字符串、内部标识符——系统——整型数)、父进程(创建本进程的进程)的标识符、用户标识符(进程所属用户的标识符)
处理机状态信息:由CPU的各种寄存器中的内容组成,当运行中断时,被保护的CPU现场信息称为进程上下文,它包含通用寄存器的内容、程序计数器的值、程序状态字PSW、进程的堆栈指针
进程调度信息:包含进程优先级、进程状态信息、其他调度信息
进程控制信息:包含程序代码和数据集所在的内存地址、资源清单、同步与通信信息、外存地址、家族信息、链接指针
进程控制
原语:用机器指令构成的一种实现特定功能的小程序,处于操作系统的底层,运行时不允许中断
创建进程:
- 交互式环境——新用户在终端输入登录命令
- 批处理环境——响应任务的要求
- 用户程序提出某种请求
- 基于应用进程的需要
创建原语creat()的操作:
- 给新进程一个编号并申请空白PCB
- 给新进程分配空间
- 初始化PCB(填入进程标识、优先级、内存地址、资源清单、家族信息、现场信息、进程状态)
- 设置合适的链接,将新进程插入就绪队列
终止进程:
- 该进程已完成所要求的功能而正常终止
- 由于某种错误而导致非正常终止
- 外界干预
终止操作:
- 查找被终止进程的PCB,读出该进程的状态
- 若状态为“执行”,立即终止该进程的执行,并置调度标志为TRUE
- 若有子孙进程,将子孙进程一同终止
- 回收PCB(资源清单)中登记的全部资源
- 将进程的PCB从所在队列摘下来
- 若调度标志为TRUE,则启动进程调度程序
阻塞进程:
- 请求系统服务:不能立即获得服务时
- 启动某种操作
- 新数据尚未到达
- 无新工作可做
阻塞原语block()的操作:
- 中断CPU,保护该CPU现场
- 将被阻塞进程置“阻塞”状态后插入阻塞队列中
- 转进程调度程序选择新的就绪进程投入运行
唤醒进程:
- 系统唤醒
- 由事件发生进程唤醒
唤醒原语wakeup()的操作:
- 将被唤醒进程从相应的等待队列中摘下
- 将被唤醒进程置为就绪态,送入就绪队列
挂起进程:
- 用户请求将自身挂起
- 父进程请求将自己的某个子孙进程挂起
- 负荷调节的需要
- 操作系统的需要
- 对换的需要
挂起原语suspend()的操作:
- 检查挂起进程的状态:活动就绪态改为静止就绪态;活动阻塞态改为静止阻塞态
- 把该进程的PCB复制到某制定的内存区域
- 若被挂起的进程正在执行,则转向调度程序重新调度
激活进程:
- 用户请求将自身激活
- 父进程请求将自己的某个子孙进程激活
激活原语active()的操作:
- 将进程从外存调入内存,检查该进程的现行状态:静止就绪态改为活动就绪态;静止阻塞态改为活动阻塞态
- 若采用抢占调度策略,则比较被激活进程与当前进程的优先级
线程
定义:是进程内的一个相对独立的、可独立调度和指派的执行单元。
性质:
- 是进程内的一个相对独立的可执行单元
- 是操作系统中的基本调度单元
- 一个进程至少有一个线程
- 线程并不拥有资源,而是共享和使用包含它的进程所拥有的全部资源
- 在需要时可以创建其他线程
线程成为进程中的一个实体,作为系统调度的基本单位。
任何一个线程都有一个独立的栈和一个线程控制块TCB
TCB内容:
- 线程状态:保存线程的当前状态(执行态、阻塞态、就绪态)
- 寄存器值:保存线程寄存器的上下文
- 堆栈指针:保存线程的栈指针
创建线程:利用线程创建函数(或系统调用)
终止线程:完成工作后自愿退出;在运行中出现错误或由于某种原因被其他线程强行终止
多线程机制:操作系统支持一个进程内执行多个线程的能力(用户级线程ULT、内核级线程KLT、混合级线程)
参考:《计算机操作系统》电子工业出版社