操作系统1-进程
进程
什么是进程
程序的顺序执行与并发执行
顺序执行:若干程序和程序段必须严格按照某种先后顺序执行
- 顺序性:操作严格按照程序规定的顺序执行;
- 封闭性:程序运行时占用全机资源;
- 可再现性:只要程序的执行环境和初始资源的条件相同,结果就相同;
并发执行:多个时间在同一个时间间隔内发生;
- 应用级并发:事务处理系统,数据库管理系统
- 系统级并发:操作系统;
- 间断性:由于资源的共享和相互合作,程序体现执行-暂停-执行的现象
- 失去封闭性:程序在并发执行时,是多个程序共享系统的资源,资源的状态有多个程序来改变;
- 不可再现性:程序在并发执行时,由于失去了封闭性,多次重复可以得到不同的结果;
进程
引入进程的目的:为了 控制 多道程序能够 正确的并发 执行
定义:(程序代码program code + 数据集set of data + 进程控制块PCB,process control block)
- 一个正在执行的程序;
- 一个正在计算机上执行的程序实例;
- 一个能够被调度到处理器上执行的实体;
- 由一串指令的执行、当前状态和一组正在使用的系统资源表征的活动单元;
进程的物理存在:进程映像
Process Image=PCB+program+data+stack
;- 进程映像取决于文件格式;
系统中同时存在的诸进程相互独立,也相互关联,这取决于设计模式;
可以说,并发基于进程;
进程控制块
进程执行的任意时刻可以由 进程控制块 表征,组成如下:
- 标识符
- 状态
- 优先级
- 程序计数器
- 内存指针
- I/O状态信息
- 记账信息……
注意,PCB常驻内存,PCB是进程存在的唯一标志;
进程的特征
- 动态性:最基本特征,是计算机的执行的程序实例,存在生命周期;
- 并发性:多个进程实体存在于内存中也能在一段时间内同时运行,可以说进程的设计就是为了操作系统的并发;
- 独立性:进程实体是独立运行的基本单位,也是系统独立获得资源和调度的基本单位,各个进程的地址空间相互独立除非进程间相互通信;
- 异步性:各个进程按照独立的,不可预知的速度向前推进;
注意:进程和程序之间不存在一一对应的关系;
进程带来的挑战
- 空间开销:为进程建立数据结构PCB
- 时间开销:管理和协调,跟踪,填写和更新相关的数据结构,切换进程,保护现场
- 控制复杂性:协调多个进程对资源的竞争和共享,预防解决多个进程因为资源竞争问题带来的故障
进程状态模型
由于进程具有动态性,执行间断性和多种状态的特征,需要建立进程状态的自动机描述;
进程轨迹trace :进程执行的指令序列,描述单个进程的行为;
调度器dispatcher:调度多个进程的执行;
以下是 轮转(round-robin) 的例子:通过指定一个时间片,处理器决定是否切换进程;
两状态模型
进程处于两种状态之一:
- 运行态:进程队列的头部进程被系统调度执行;
- 非运行态:进程创建后,以非运行态进入进程队列中;
进程队列:存放指向特定进程的指针;
三状态模型
进程处于三种基本状态之一:
- 就绪ready:
- 进程已经获得除开CPU外的所有必要资源后,只需获得CPU立即执行进程
- 执行running:
- 进程获得CPU,程序正在执行;
- 阻塞waiting:
- 正在执行的进程因为其他事件的等待无法继续执行;
- 进程放弃处理机而处于暂停状态;
对于一些嵌入式的操作系统,三状态模型足以描述:
注意:
- 状态转换并非都可逆
- 一个进程在任何一个指定的时刻必须而且只能处于一
种状态 - 时间片完也不是执行-就绪的唯一原因,可能是高优先级抢占控制权
- 在单处理机系统中,只有一个进程处于执行状态
五状态自动机
进程新增两个状态后真正称为自动机模型:
- 新建New:
- 进程刚刚创建,OS完成了进程创建的必要工作(构造了进程标识符,创建了进程管理的表格)
- OS未将进程加入可执行进程组,进程自身未进入主存,进程尚未被同意执行,进程的程序也没有分配空间而保存在辅存;
- 进程创建原因:新的批处理作业,交互登陆,提供服务,现有进程派生
- 终止Exit
- 进程不再具有执行资格;
- 表格和其他信息暂时保留,OS从可执行进程组释放;
- 原因:正常完成,超时,无可用内存,各种错误…
注意:
- 加载/接纳:OS做好接纳进程的准备后,将一个进程从新建态转换成就绪态;
- 就绪-退出,阻塞-退出:某些系统中,父进程可以在任何时候终止一个子进程,这样的转换可能存在;
排队模型实现:维护就绪队列和阻塞队列
- 进入OS的每个进程放在就绪队列中,OS选择进程运行时在就绪队列中选择一个;
- 运行的程序被移除处理器后,要么终止,要么进入就绪队列或阻塞队列
- 某事件发生导致阻塞队列中的相应进程进入就绪队列中;
具体实现:
多阻塞队列可以避免对很长的队列进行扫描;
七状态自动机
交换技术swapping和挂起suspend
进程竞争内存资源:内存紧张,或者所有进程因为某事件等待,但是无就绪进程,处理机实际空闲
解决方案:扩充内存,swapping
- 将内存中处于阻塞、就绪、甚至是执行状态的进程swapping-out进外存(磁盘)
- 不再参与CPU的竞争,我们把这种静止状态称为挂起状态;
- 在磁盘中维护一个挂起队列,建立虚存;
- 当存在已具备运行条件的进程或进程所需要的数据和程序,Swapping-in到内存。
进程挂起的原因:
- 进程全部阻塞,处理机空闲
- 交换,如系统负荷过重,内存空间紧张
- 操作系统的需要,操作系统可能需要挂起后台进程或一些服务进程,或某些可能导致系统故障的进程。
- 终端用户的请求,如调试
- 父进程请求
被挂起进程的特征
- 不能立即执行
- 挂起条件独立于阻塞条件
- 使之挂起的进程:自身、OS、父进程
- 激活挂起进程的进程:实施挂起操作的进程
当被挂起的进程返回内存时,OS不一定执行的准备,进一步划分:
- 就绪挂起:进程在外存,只要调入内存并获得CPU即可执行
- 阻塞挂起:进程在外存,并等待某事件
注意:
- 加载:新建进程后,进程要么加入就绪队列,要么进入就绪挂起队列,视当时的资源而定;
- 创建进程的just-in-time原理:尽可能推迟创建进程以减小系统的开销;
- 运行-就绪挂起:一般来说,运行进程的分配时间到期后就会转换成就绪态,但是某个具有高优先级的进程位于阻塞/挂起队列不被阻塞时,OS会抢占这个进程
进程描述
进程的执行必须由操作系统分配资源,操作系统是资源的管理者:采用表格记载资源的信息,进而实现资源的管理,维护和更新;
- 内存表
- I/O表
- 文件表
- 进程表
进程控制块
包括信息主要有三类:
- 进程标识信息;唯一标识一个进程
- 内部标识符:操作系统为每个进程赋予的一个唯一整数,便于系统控制
- 父进程标识符
- 用户标识符
- 处理机状态信息:主要是上下文,由处理器的各种寄存器中的内容组成的
- 通用寄存器
- 控制和状态寄存器
- 栈指针
- 进程控制信息:与进程调度和进程切换有关的信息
- 进程状态
- 进程优先级
- 时间记账
- 阻塞原因
- 链接指针
- 进程间通信
- 程序和数据地址
- 资源所有权和使用情况
进程的组织方式
索引
系统为所有进程的状态建立几张索引表;
链接
单一队列:所有PCB块连接成一个队列
多级队列:相同状态的PCB块连接成一个队列
内核
内核是操作系统的核心,是包含重要系统功能的部分,常住内存以提高操作系统的系统功能;
不同操作系统对内核的设计(功能范围的设定)不同;
资源管理
进程管理:进程的创建和终止,调度,分配,切换,同步和进程间通信,管理PCB
存储管理:为进程分配地址空间,交换,页和段管理
I/O管理:缓冲区管理,为进程分配I/O通道
支撑功能
- 中断:操作系统的一切重要活动最终依赖于中断
- 时钟
- 记账
执行模式
- 大多数处理器至少支持两种模式:内核模式,用户模式
- 某些指令只能在特权模式运行,部分内存只能在特权模式下访问
- 采用两种模式可以保护操作系统和重要的系统操作表不受程序干扰
- 查看运行模式:程序状态字寄存器PSWR下指示执行模式的位
模式切换:
- 原因:系统调用或中断,中断发生时,将程序计数器设置为中断程序处理的开始地址,切换成内核模式使得中断程序可以执行某些特权指令
- 中断不一定引发进程切换,也不一定造成模式切换,模式切换和进程切换无决定关系
进程控制
进程控制包括以下事件:
- 进程的穿件与撤销
- 进程的阻塞和唤醒
- 挂起和激活
- 进程切换
实现方式:原语Primitive
- 原语用于完成一定功能的过程,定义了原子操作
- 其执行过程不允许被中断;
create原语:创建进程
- 为新进程分配唯一一个进程标识符
- 为进程分配空间
- 初始化进程控制块(标识信息,处理机状态信息,调度信息)
- 建立连接,插入就绪(就绪/挂起)队列
- 建立扩充其他相关的数据结构
后面两步是方便操作系统管理进程的必要步骤;
进程终止原语
- 根据标识符找到其PCB,读出进程的状态
- 对于执行状态的进程,终止它,调度下一个进程就绪进程的执行
- 若进程存在子进程,不同的操作系统有不同的处理方式,挂在其他结点或者终止它
- 将进程的全部资源归还(父进程或者OS)
- 被终止进程的PCB从队列中移除,等待其他程序搜集信息
进程阻塞
- 对于执行状态的进程发生阻塞时,使用Block()原语将自己阻塞
- 将PCB的状态由执行到阻塞将PCB加入阻塞队列
- 将处理剂分配给下一个就绪进程并切换
进程唤醒
- 被阻塞进程期待的事件出现时,有关进程调用唤醒原语wakeup(),等待该事件的进程唤醒
- 唤醒进程原语执行:将被阻塞进程从队列移出,将PCB中现行状态由阻塞改为就绪,插入到就绪队列中
进程挂起
出现引起进程挂起的事件时,系统将利用挂起原语suspend()将指定挂起;
- 检查被挂起的状态
- 插入相应队列
进程激活
- 发生激活进程的事件时,将在外存上处于挂起的进程换入内存
- 利用激活原语active()将指定进程从外存调入内存:检查进程状态,插入相应队列
进程切换
进程切换:调度另一个就绪进程占用处理器
进程上下文:进程执行的现场
发生原因:
- 时钟中断
- IO中断
- 内存失效
- 陷阱
- 系统调用
步骤:
- 保存处理器上下文,包括程序计数器和其他寄存器
- 更新运行进程的PCB
- 将PCB移动到相应队列
- 选择另一个进程执行
- 更新另一个PCB
- 恢复被选择的上下文
线程
线程是进程的一个实体,是独立调度和分派的基本单位;
进程是系统进行资源分配和调度的独立单位;
线程是进程的一个实体,是对调度和分配的基本单位;
- 进程是系统中拥有资源的单位,比如进程映像的地址空间,全局变量,打开文件,IO设备
- 线程,拥有少量的私有资源(线程控制块,栈…)
- 同一进程哪的线程共享全部资源
- 同一进程的线程切换不会引发进程切换
- 不同进程中线程切换将引起进程切换
- 同一进程的多个线程也存在并发,提高系统资源的使用和系统吞吐量
- 线程间通信比进程间通信快很多
- 线程的系统开销小于进程,同一进程的多个线程同步和通信更容易
状态
- 就绪状态
- 执行状态
- 阻塞状态
一般不具有挂起状态,一个进程可以创建和撤销多个线程,同一个进程的多个线程可以并发执行
基本操作
- 派生spawn:
- 阻塞block
- 解除阻塞ubblock
- 结束finish
分类
- 用户级线程
- 内核级线程
- 混合线程