操作系统(一)
1 概述
多道程序同时计算
-
原因:
- CPU速度与I/O速度不匹配的矛盾,非常突出
- 只有让多道程序同时进入内存争抢CPU运行,才可以使得CPU和外围设备充分并行,从而提高计算机系统的使用效率
-
示例:
- 实现:
- 为进入内存执行的程序建立管理实体:进程
- OS控制进程执行和资源的调度
- 如何让正在运行的程序让出CPU:中断(中断正在执行的程序,引入OS处理),中断是激活CPU的唯一手段,启动等也属于中断
系统调用
- 概念:
- 系统调用是操作系统的程序接口,为所有运行程序提供访问操作系统的接口。它是操作系统完成某种特定功能的过程。
- 实现:
- 陷入处理机制:控制和实现系统调用的机制
- 需设计一张系统调用入口地址表,每个入口地址指向一个系统调用的处理程序,并包含系统调用自带参数的个数
- 需开辟现场保护区,以保存发生系统调用时的处理器现场
- 陷入指令:异常中断指令,为实现系统调用而引起处理器中断的指令
- 每个系统调用都事先规定了编号,并在约定寄存器中规定了传递给内部处理程序的参数
- 陷入处理机制:控制和实现系统调用的机制
2 处理器管理1 中断
指令执行过程
- 取指:CPU根据PC从存储取出机器指令放入IR
- 解码:IR解译指令
- 执行:连接CPU控制单元和算术逻辑单元,执行指令
程序状态字PSW
- PSW,指一个或一组控制与状态寄存器,保存当前程序运行的动态信息,比如PC、IR、中断字、中断屏蔽、处理器模式等
用户态与内核态
- 设计的处理器模式,用来实现特权指令管理
- 内核态可以执行全部指令,用户态只能执行非特权指令。特权指令如置PC寄存器、启动I/O指令
- \(用户态 \stackrel{中断、异常、系统异常}{\rightarrow} 内核态\)
- \(内核态 \stackrel{内核处理完成,调用中断返回指令}{\rightarrow} 用户态\)
中断概念
- 广义中断概念:
- 暂时停止当前CPU上运行的程序。然后处理中断事件。处理完返回被中断处,或根据中断优先级调度其他程序。
- 狭义中断、异常、系统异常都属于广义中断。
- 中断、异常、系统异常:
- 狭义中断,指来源于处理器之外的中断事件,即与当前运行指令无关的中断事件,如I/O中断、外部信号中断等。这种情况要保存并恢复上下文环境。
- 异常,指当前运行指令引起的中断事件,如地址异常、算术异常(比如除数为0)
- 系统异常,触发系统调用引起的中断事件,如请求设备、请求I/O、创建进程等。系统异常可视为异常的一类
中断系统
-
中断响应(硬件完成) + 中断处理(软件完成)
-
中断响应:
- 在指令执行周期最后增加一个微操作,以响应中断。
- 过程:
- 发现中断源,决定是否中断屏蔽。当有多个要响应的中断源时,按规定的优先级选择。
- 中断当前程序的执行,保存当前程序的PSW到核心栈
- 转向操作系统的中断处理程序
-
中断处理:
- 过程:
- 处理中断事件
- 恢复正常操作(内核态 --> 用户态)
- 过程:
-
中断系统处理流程:
- 中断码:PSW中字段,可用来分析被中断程序的中断源
- 交换新旧PSW:把当前被中断的程序的PSW/PC记录下来,同时把操作系统内核程序的PC置到PC寄存器中,使得内核程序占有处理器运行。
多中断响应与处理
-
中断屏蔽
- 有选择的响应中断,中断装置通过中断屏蔽位决定是否响应已发生的中断
-
中断优先级
- 多个中断,根据中断优先级响应一个中断事件
-
中断的嵌套处理
- 当计算机响应中断后,在中断处理过程中,可以再响应其他中断
- 中断的嵌套处理改变中断处理次序,先响应的有可能后处理
2 处理器管理2 进程
进程概念
- 进程是资源分配的最小单位,可以理解成一个独立程序关于某个数据集合的一次运行活动。
- 进程控制块PCB,有标识信息(进程标识号)、现场信息(如寄存器内容)、控制信息(如进程特权信息、进程调度信息)
- 内存程序P、内存数据D、通用寄存器信息R
- 程序状态字PSW
- 进程上下文:
- 进程执行的现场信息和执行信息
- 包括:
- 用户级上下文:用户程序块/用户数据区/用户栈/ 用户共享内存
- 寄存器上下文:PSW/栈指针/通用寄存器
- 系统级上下文:PCB/内存区表/核心栈
进程状态模型
- 进程状态
- 运行态:进程占有处理器运行
- 就绪态:进程具备运行条件等待处理器运行
- 等待态:进程由于等待资源、输入输出、信号等而不具备运行条件
- 挂起态:因为运行资源不足,比如性能低或死锁,暂时被淘汰出内存的进程。剥夺内存和其他资源,不参加进程调度,待适当时候调入内存,恢复资源,参与调度。
- 挂起态与等待态有本质区别,挂起态没有任何资源,等待态占有已申请到的资源处于等待
- 进程三态:
- 进程五态:
进程管理 - 进程队列模型
- 进程管理实现的基本模型
- 过程:
- 进程首先处于短暂的新建态,创建完成后加入就绪队列
- 处理器空闲时,选择一个占有处理器运行
- 运行时出现等待事件后运行态进程会进入等待队列,不同的等待原因会构成不同的等待队列等待事件结束后,进程又会加入就绪队列
- 运行时间片到或出现更高优先级进程,运行态进程会让出处理器进入就绪队列,进程调度选择新进程运行
- 运行结束后,进程会进入短暂的终止态,善后之后退出
进程管理 - 原语与进程控制原语
- 进程控制过程中涉及对OS核心数据结构(进程表/PCB池/队列/资源表)的修改
- 原语是由若干条指令构成的完成某种特定功能的程序,执行上具有不可分割性
- 原语的执行可以通过关中断实现
- 原语前关掉中断,原语后打开中断
- 进程控制原语和进程通信原语
进程管理 - 进程切换
-
从一个正在运行的进程中回收CPU,让待运行程序来占有CPU运行
-
本质是两个进程的进程上下文切换
- 进入内核态
- 保存被中断进程的上下文
- 转向中断/异常/系统调用处理程序
- 转向进程调度
- 恢复待运行进程的上下文
- 进入用户态
-
进程切换发生在系统调用/中断/异常处理过程中,但是系统调用/中断/异常处理不一定触发进程切换
-
处理器模式切换,因为进程切换必须在操作系统内核模式下完成
- 用户模式到内核模式:由中断/异常/系统调用中断用户进程执行而触发
- 内核模式到用户模式:OS执行中断返回指令将控制权交还用户进程而触发
2 处理器管理3 线程
线程概念
-
单线程结构进程在并发程序设计上的问题:
- 进程切换、进程通信开销大
- 限制并发粒度、降低并行效率
-
线程是系统调度和分派的最小单位,能轻量运行,会被频繁调度和切换。
- 同一个进程中的所有线程共享进程获得的主存空间和资源。线程具有独立的PC、执行堆栈、线程状态、线程上下文、容纳局部变量的静态存储器
-
OS对线程的感知:
- 感知线程环境下:处理器调度对象是线程,进程没有三状态
- 不感知线程环境下:处理器调度对象仍是进程,用户空间中的用户调度程序调度线程
多线程的实现
- 内核级多线程KLT和用户级多线程ULT:
-
内核级线程 用户级线程 处理器是否感知 是。线程管理的所有工作由OS内核完成。OS直接调度KLT 否。线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在。因此能运行在任何OS上,内核在支持ULT方面不需要做任何工作。 线程切换开销 线程切换开销大。应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要模式切换,系统开销较大 线程切换开销小。所有线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,能节省模式切换开销和内核的宝贵资源。允许进程按应用特定需要选择调度算法,甚至根据应用需求裁剪调度算法 能否利用多处理器并行 多处理器环境中,内核能同时调度同一进程中多个线程并行执行。 不能利用多处理器的优点,OS调度进程,仅有一个ULT能执行 某个线程阻塞影响 一个KLT被阻塞了,内核能调度同一进程的其它线程占有处理器运行 一个ULT的阻塞,将引起整个进程的阻塞(致命缺点)。用jacketing技术解决(把阻塞式系统调用改造成非阻塞式的,当线程陷入系统调用时,执行jacketing程序。由jacketing 程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程) 开发者使用 OS提供API直接使用KLT 通过线程库进行程序设计,再连接线程库后台运行 优点 物理并行性好 逻辑并行性好,切换快、可裁剪 -
混合式策略:
- 组合KLT和ULT,结合优点,减少缺点,提高逻辑并行性和物理并行性
- 线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行
- 一对一、多对一、多对多等等,一个应用中的多个ULT被映射到一些(小于等于ULT数目)的KLT上,可以调整KLT数量达到最佳效果。只有活跃态ULT才绑定到KLT的线程三态上。
进程调度算法
非抢占 | 抢占 |
---|---|
FCFS (先来先服务) | RR (时间片轮转) |
SPN (最短进程优先) | Feedback (多级反馈调度) |
HRRF (最高响应比优先) | |
SRT (最短剩余时间优先) |
-
非抢占式:运行 - > 就绪不发生,适合以计算为主的进程
-
抢占式:I/O频繁的进程
-
未加粗的都需要提前预估进程的CPU运行时长,所以有问题,只是概念级,不能实际应用
-
FCFS (先来先服务):
- 当某个进程就绪时,都加入就绪队列(ready queue)
- 当前正在运行的进程停止执行时,选择在就绪队列到存在时间最长的进程运行
- 问题:
- 一个短进程可能不得不等待很长时间才能获得执行
- 偏袒计算为主的进程,I/O多的进程不得不等待计算为主的进程做完
-
SPN (最短进程优先):
- 选择所需处理时间最短的进程
- 短进程将会越过长进程,优先获得调度
- 问题:
- 只要持续不断地提供更短的进程,长进程就有可能饿死。
-
SRT (最短剩余时间优先):
- 调度器总是选择预期剩余时间更短的进程
- 当一个新进程加入就绪队列,他可能比当前运行的进程具有更短的剩余时间,只要该新进就绪,调度器就可能抢占当前正在运行的进程
-
HRRN (最高响应比优先) Highest Response Ratio Next
- 选择响应比最高的
- (等待时间 + 期待服务时间)/ 期待服务时间
-
RR(时间片轮转) Round Robin
- 基于时钟做抢占式调度
- 以一个周期性间隔产生时钟中断,当中断发生时,当前正在运行的进程被置于就绪队列中,然后基于FCFS策略选择下一个就绪进程运行
- 优缺点:
- 优点:公平,响应快,适用于分时操作系统
- 缺点:由于高频率的进程切换,因此会有一定的开销,不区分任务的紧急程度
-
Feedback(多级反馈调度)
- 建立多个不同优先级的就绪进程队列,多个就绪进程队列之间按照优先级调度
- 单个就绪进程队列中的进程 按照先来先服务算法调度
- 当一个进程第一次进入系统时,它被放置在RQ0,当它第一次被抢占后并返回就绪状态时,它被放置在RQ1。在随后的时间里,每当它被抢占时,它被降级到下一个低优先级队列中。一个短进程很快会执行完,不会在就绪队列中降很多级。
-
传统Unix调度:
- 多级反馈队列,每个优先级队列使用时间片轮转