处理器状态
特权指令和非特权指令
- 特权指令:
仅在内核态下才能使用的指令,这些指令设计改变机器状态、修改寄存器内容、启动设备等敏感操作 - 非特权指令:
在目态(用户态)和管态(内核态)都能工作
操作系统能执行所有指令,应用程序只能使用非特权指令
内核态和用户态
操作系统中的程序可分成两大类:系统程序 和 应用程序
- 系统程序
可信程序,完成系统任务,有权管理和分配资源 - 应用程序
非可信程序,实现应用任务,只能申请使用资源
根据执行程序对资源和机器指令的使用权限,将处理器设置成不同的状态—— 内核态 和 用户态
- 内核态
运行可信系统软件,全部机器指令都被允许在处理器上运行 - 用户态
运行非可信应用程序,无法执行特权指令
处理器状态及其转换
- 用户态 -> 内核态
- 程序请求操作系统服务,执行系统调用
- 产生中断事件,运行程序被打断,转向中断处理程序处理
- 产生异常事件,转向异常处理程序
这三种情况都通过中断机制发生,中断和异常是用户态到内核态转换的仅有途径
- 内核态 -> 用户态
- 通过特定的特权指令
中断技术
中断是现代操作系统并行性的基础之一
中断源分类
- 硬中断
由硬件发出或产生的中断- 外中断( 中断 or 异步中断 )
指来自处理器之外的中断信号,包括时钟中断、键盘中断、它机中断、外部设备中断等。- 可屏蔽中断
- 不可屏蔽中断
- 内中断( 异常 or 同步中断 )
指来自处理器内部的中断信号,通常是由于在程序执行过程中,没发现当前指令关联的、不正常的或错误的事件- 仿管中断,由系统调用引起
- 硬件故障中断
- 程序性异常,如非法操作、越界等
内中断不能被屏蔽
- 外中断( 中断 or 异步中断 )
中断和异常的区别:
- 中断是由于当前程序无关的中断信号触发的,系统不能确定发生时间,所以中断与CPU是异步的。CPU对终端的响应完成是被动的
异常是由CPU控制单元产生的,源于现行程序执行指令过程中检测到例外 - 中断要求被快速处理,以便及时响应其他中断信号
异常处于被打断的当前进程上下文中(必须要异常才能继续,如缺页中断),所提供的服务是当前进程所需要的,异常处理过程可以阻塞 - 中断允许发生嵌套,异常大多为一重。异常处理过程可能产生中断,中断处理过程不会被异常打断
中断描述符表
中断描述符表包含256个表项,每个中断/异常都对应一个,每个表项称为一个门描述符,作用是把程序控制权转交给中断/异常处理程序
Linux系统要处理3种门机制
- 中断门,用于关中断的中断或异常处理
- 陷阱门,用于开中断的异常处理
- 系统门,用于系统调用
Linux中断
- 上半部分
函数每当接收到中断立即开始工作,在关中断状态下只做严格限时且与硬件相关的任务,然后标记中断,通知下半部分做剩余工作
上半部分是中断向量表中登记的中断处理程序入口,在执行过程中要决定其相关的下半部分是否执行 - 下半部分
耗时工作尽可能放到下半部分。它是可中断的,如果运行期间其他设备产生新中断,则下半部分暂时被中断,等那个设备上半部分运行完毕,再回来运行
进程
多道程序设计操作系统都建立在进程的基础上
为了使多个程序并发执行,以便改善资源利用率和提高系统效率
引入进程的目的
- 刻画程序的并发性
- 解决资源的共享性
可再入程序是指能够被多个程序同时调用的程序
可再用程序是指在被调用过程中可以有自身的修改,在调用它的程序退出之前不允许其他程序来调用
进程的属性
- 动态性
进程是程序在数据集合上的一次执行过程,是动态概念,程序是静态概念 - 共享性
多个不同进程可运行相同程序 - 独立性
进程是操作系统中一个独立实体 - 制约性
进程因共享资源或协同工作产生的相互制约关系,造成彼此速度的不可预测性
进程的状态
-
三态模型
image.png
- 运行态 —— 进程占有处理器正在运行的状态
- 就绪态 —— 进程具备运行条件,等待系统分配处理器的状态
- 等待态 —— 又称阻塞或睡眠态,进程不具备运行条件,正在等待某个时间完成的状态
-
七态模型
image.png
当系统资源尤其是内存资源已经不能满足进程运行的要求时,必须把某些进程对换到磁盘对换区,释放它占有的资源- 挂起就绪态 —— 表明进程具备运行条件,但目前还在外存中
- 挂起等待态 —— 进程正在等待某一个事件发生且在外存中
进程控制块
每个进程有且仅有一个进程控制块(PCB)
- 进程存在的唯一标识
- 操作系统用来记录和刻画进程状态及环境信息的数据结构
- 是进程动态特征的汇集
- 是操作系统掌握进程的唯一资料结构和管理进程的主要依据
PCB包括三类信息:
- 标识信息
如进程标志ID,进程组标志ID,进程名,用户组名 - 现场信息
通用寄存器内容、控制寄存器内容、栈指针、程序状态字 - 控制信息
用于管理和调度进程,包括,进程调度的相关信息,如:进程状态、等待事件、等待原因、进程优先级、队列指针等
进程上下文的切换
中断和异常是仅有的方法,它暂停当前运行的程序的执行,把处理器转换至内核态,内核获得处理器控制权后,如果需要就可以实现进程上下文切换。进程切换必定在内核态
进程切换步骤:
- 保存被中断进程的处理器的现场信息,修改被中断进程PCB有关信息,如进程状态
- 把被中断进程的PCB加入相关队列,选择占用处理器运行的另一个进程,修改被选中进程PCB有关信息,如改为就绪态
- 设置被选中进程的地址空间,恢复存储管理信息(上下文数据结构的恢复)
- 根据被选中进程上下文来恢复处理器现场(处理器现场的恢复)
处理器状态的转换(处理器模式转换)
从 用户态 -> 内核态 or 内核态 -> 用户态 的转换是处理器的状态转换,此时仍在同一个进程中。
当发生中断时,暂停正在运行的进程(暂时运行进程的代码,运行系统代码,但仍处于该进程,进程上下文没变),把处理器状态从用户态转换到内核态
在大多数情况下,状态转换不一定引起上下文切换
线程
线程是进程中能够并发执行的实体,是进程的组成部分,也是处理器调度和分派资源的基本单位
允许进程包含多个线程,这些线程共享进程所获得的存储空间和资源,可以为完成某一任务协同工作
线程状态 —— 运行、就绪、等待、和终止
进程分为资源集合和线程集合
![](https://img.haomeiwen.com/i7185060/00a446934421d533.png)
目的
为了减少程序并发执行时所付出的时空开销,使得并发粒度更细,并发性更好
优点
- 快速线程切换
同一进程中的多线程切换只需要改变堆栈和寄存器,地址空间不变 - 通信易于实现
自动共享进程的内存和文件,线程可自由访问全局数据,实现数据共享十分方便,线程通信相对简单不必经过内核 - 减少管理开销
线程创建和撤销工作比进程少,并且不虚再分配存储空间和各种资源 - 并发程度提高
内核级线程
线程管理工作由内核完成,并提供线程API来使用线程
用户级线程
线程管理工作由应用程序来做,在用户空间实现,内核不知道线程的存在
POSIX,可移植操作系统接口
POSIX标准定义了操作系统应该为应用程序提供的接口标准
处理器调度
处理器调度层次
- 高级调度(作业调度)
多道批处理操作系统中,从输入系统的一批作业中按照预定的调度策略挑选若干作业进入内存,为其分配资源并创建对应的作业用户进程 - 中级调度
根据内存资源情况决定内存中所能容纳的进程数目,并完成外存和内存中的进程对换工作(挂起)。起到短期均衡系统负载的作用 - 低级调度(进程调度/线程调度)
根据某种原则决定就绪队列中哪个进程/线程获得处理器,并将处理器出让给它使用
低级调度是各类操作系统必备功能,一般操作系统都配置高级调度和低级调度,而功能完善的操作系统为了提高内存利用率和作业吞吐量引进了中级调度。
![](https://img.haomeiwen.com/i7185060/27e64e4044065ec2.png)
作业和进程的关系
作业是任务实体,进程是完成任务的执行实体。作业的概念多用于批处理操作系统,而进程用于各种多道程序设计系统
![](https://img.haomeiwen.com/i7185060/67b720458be825c6.png)
低级调度的基础类型
- 剥夺式
- 高优先级剥夺低优先级
- 运行的进程/线程时间片用完
- 非剥夺式
某个进程开始运行后就不再让出处理器,除非运行结束或主动放弃,或发生某个事件不能继续执行
23. 调度算法
- 先来先服务算法(FCFS)
- 最短作业优先算法(SJF)
总是选取预计时间最短的作业运行 - 最短剩余时间优先算法(SRTF)—— 剥夺
- 最高响应比优先算法(HRRF)—— 非剥夺
响应比 = 作业周转时间 / 作业处理时间 = 1 + 作业等待时间 / 作业处理时间
优点:既照顾段作业又不会让长作业等待时间过长
缺点:每次计算作业响应比会导致一定时间开销 - 优先级调度算法
- 轮转调度算法(时间片调度,RR)—— 剥夺
- 多级反馈队列调度算法
- 将就绪进程分为两级或多级,系统相应建立两个或多个就绪进程队列,较高优先级的队列一般分配给较短的时间片,较低优先级的队列一般分配给较长的时间片。
- 处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取(按FCFS)。
-
当进程唉时间片用完时仍处于就绪态,它将排入低一级的优先级队列(但时间片更长)
image.png
网友评论