处理器的两种状态
用程序状态字寄存器PSW中的某标志位来识别当前处理器处于什么状态
- 核心态
- 用户态
核心态
处理器处于核心态时,程序可以执行特权指令和非特权指令,使用所有资源
用户态
处理器处于用户态时,只能执行非特权指令,比如“清空内存”这种特权指令不能在用户态执行
PSW
某标志位可以识别处理器处于什么状态,主要作用是实现程序状态的保护和恢复
用户栈和核心栈
用户栈
用户进程空间中开辟出的内存区域
核心栈
每个进程被创建时捆绑一个,是内存中属于os空间的区域
中断
- 外中断(中断)
- 内中断(异常) 本质:发生中断就意味着需要os介入,开展管理工作
中断是实现“用户态”->“核心态”的唯一途径
而“核心态”->“用户态”是通过执行一个特权指令,将PSW的标志位置为用户态
cpu与外部设备的并行工作的硬件基础是中断和通道
内中断
信号来源:cpu内部与当前执行指令
分为:
- 自愿中断
- 强迫中断
自愿中断
指令中断,系统调用时的访管指令
软件中断
硬件中断,如缺页
软件中断,整数除0
外中断
信号来源:cpu外部与当前执行的指令无关
-
外设请求,如IO操作完成发出中断信号
-
人工干预,如用户强行终止一个进程
进程
引入多道程序技术之后,内存中同时放入多道程序,各个程序的代码、运算数据存放的位置不同。os要怎么才能找到各程序的存放位置?
系统为每个运行的程序配置了一个数据结构,成为进程控制块(PCB),用来描述进程的各种信息
PCB是进程存在的唯一标志
进程实体
也叫进程映像
- PCB
- 程序段
- 数据段
- 核心栈
一般情况下,把进程实体就简称为进程
PCB组成
- 进程描述信息,PID
- 进程控制和管理信息,进程当前状态、进程优先级
- 资源分配清单,程序段指针、数据段指针、键盘、鼠标
- 处理机相关信息,各种寄存器值
进程定义
- 进程实体的运行过程(动态性)
- 系统进行资源分配和调度的一个独立单位
进程状态及转换(进程控制)
三种基本基本状态
- 执行态
- 就绪态
- 等待态 执行态:占有cpu,并在CPU上运行
就绪态:已具备运行条件,但由于没有空闲cpu,而,暂时不能运行
阻塞态:又叫等待态,因等待某一事件而暂时不能运行,如等待os分配打印机、等待读磁盘操作的结果。
还有两种状态:
新建态:进程正在被创建,os为进程分配资源、初始化PCB
“终止态”:进程正在从系统中撤销,os会回收进程拥有资源、撤销PCB
再新增两种状态: “挂起就绪态” “挂起阻塞态”
什么是挂起?为什么要有“挂起”状态?
为了让某些进程暂时不参与低级调度,释放它占有的资源,以减小1系统负荷为目的而引入挂起态
状态转换
五状态转移图
七状态转移图
运行态->阻塞态是进程自身做出的主动行为
阻塞态->就绪态不是进程自身控制的,是一种被动行为
所以,不能由阻塞态->运行态,也不能由就绪态->阻塞态,因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求
原语
用原语实现进程控制
原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作叫原子操作
原语采用“关中断指令”和“开中断指令”
关/开中断指令的权限非常大,必然只允许在核心态下执行特权指令
线程
线程是处理机调度的基本单位
引入线程带来的变化
| 引入线程前 | 引入线程后 |
|---|---|
| 进程是资源分配、调度的基本单位 | 进程是资源分配的基本单位,线程是调度的基本单位 |
| 只能进程并发 | 进程内的线程之间也能并发,提升了并发度 |
| 进程间并发需要切换运行环境,开销大 | 如果同一进程内的线程切换,则不需要切换进程环境,开销少 |
线程的实现方式
用户级线程
用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责,用户级线程中,线程切换可以在用户态下即可完成,无需os干预
在用户看来,是有多个线程,但是在os内核看来,并没有意识到线程的存在
内核级线程
内核级线程的管理工作由os内核完成,线程调度、切换等工作等都由内核负责,因此内核级线程的切换需要在核心态下才能完成
处理机的三个层次调度
- 高级调度(作业调度)
- 中级调度(内存调度)
- 低级调度(进程调度)
高级调度
按一定的规则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应进程(建立PCB),使他们获得竞争处理机的权利
对进程状态的影响:无->创建态->就绪态
每个作业只会被调入一次,调出一次
中级调度
引入虚拟存储技术之后,可将暂时不能运行的进程调至外存等待,等它重新具备了运行条件且内存有空闲时,再重新调入内存。
这么做是为了提高内存利用率和系统吞吐量
暂时调到外存等待的进程状态为挂起状态,注意:PCB并不会一起调到外存,而是会常驻内存。PCB会记录进程数据在外存中的存放位置,进程状态等信息,os通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中
中级调度,就是要决定将哪个处于挂起状态的进程重新调入内存,一个进程很可能会被多次调入调出内存,因此中级调度发生的频率要高于高级调度
对进程状态的影响:挂起态->就绪态
低级调度
其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它
进程调度是os中最基本的一种调度,在一般的os中都必须配置进程调度
频率很高,一般几时毫秒一次
对进程状态的影响:就绪态->执行态
调度算法的评价标准
- cpu利用率
- 系统吞吐量
- 周转时间
- 响应时间
系统吞吐率
单位时间内完成的作业数量
周转时间
从作业提交给系统开始,到作业完成为止这段时间
它包括4个部分:
- 作业在外存后备队列上等待作业调度的时间
- 进程在就绪队列上等待进程的时间
- 进程在cpu上执行的时间
- 进程等待IO操作完成的时间 后三项在一个作业处理过程中,可能发生多次
平均周转时间
各作业周转时间之和/作业数
带权周转时间
作业周转时间/作业实际运行时间
响应时间
指从用户提交请求到首次产生响应所用的时间
调度算法
- 先来先服务(FCFS)
- 短作业(SJF)
- 高响应比优先(HRRF)
先来先服务(FCFS)
算法思想
主要从“公平”的角度考虑
算法规则
按作业/进程到达的先后顺序服务
用于作业/进程调度?
用于作业调度时,考虑的是哪个作业先到达后备队列
用于进程调度时,考虑的是哪个进程先到达就绪队列
抢占式?
非抢占式
优缺点
优点:公平、算法实现简单
缺点:排在长作业(进程)后面的短作业需要等待很长时间,对长作业有利,对短作业不利
导致饥饿?
饥饿:某进程/作业长期得不到服务
不会饥饿
短作业优先(SJF)
算法思想
追求最少的平均等待时间,最少的平均周转时间
算法规则
最短的作业/进程优先得到服务(所谓最短,指要求服务时间最短,即执行时间)
用于作业/进程调度?
可用于作业调度,也可用于进程调度(SPF)
抢占式?
非抢占式,但也有抢占式的版本--最短剩余时间优先(SRTN)
优缺点
优点:“最短”平均等待时间、最少平均周转时间
缺点:对短作业有利,对长作业利,可能会导致饥饿
导致饥饿?
可能会
高响应比优先(HRRF)
算法思想
综合考虑作业/进程的等待时间和要求服务的时间
算法规则
在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
响应比=(等待时间+要求服务时间)/要求服务时间
用于作业/进程调度?
可用于作业/进程调度
抢占式?
非抢占式
当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
优缺点
导致饥饿?
不会
时间片轮转(RR)
算法思想
公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应
算法规则
按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队
用于作业/进程调度?
可用于进程调度(只有作业放入内存建立了相应的进程后,才能被分配处理机时间片)
抢占式?
若进程未能在时间片内运行完,将被强行剥夺处理机使用权,因此时间片轮转调度算法属于抢占式的算法,由时钟转置发出时钟中断来通知cpu时间片已到
优缺点
优点:公平、响应快,适用于分时操作系统
缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度
导致饥饿?
不会
优先级调度
算法思想
随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务紧急程度来决定处理顺序
算法规则
调度时选择优先级高的作业/进程
用于作业/进程调度?
都可
抢占式?
都有
优缺点
优点:优先级区分紧急程度、重要程度,适用于实时os
缺点:若源源不断的有高优先级进程到来,则可能导致饥饿
导致饥饿?
会