1.Overview
- 4大特点: 并发共享虚拟异步 (并发-异步,共享-虚拟)
- 5大功能: cpu/存储/设备/文件/IO接口 (类比冯PC的arch: 输入输出即IO接口, cpu(运算器+控制器), mem)
- 重中之重:
- (1)进程管理
- 进程描述与控制:
- 进程的 描述/创建/销毁/阻塞/唤醒/挂起/激活
- 并发: 多进程-进程间同步/多线程
- 多进程之间的同步和互斥的制约关系
- 互斥之临界资源
- 互斥之临界区
- 进程间同步的机制
- 信号量机制
- cpu调度
- 调度的目标
- 3层次的调度-3种调度模型
- 作业调度
- 进程调度
- 实时调度
- 目标: 实时-确保DDL,但也分硬实时和软实时,看赶不到DDL的后果严重性评判 (导弹发射 vs. 卖火车票)
- 死锁
- 死锁本质原因
- 僧多粥少,进程数大于资源数
- 死锁的4个必要条件(同时满足才死锁)
- 互斥访问
- 不可抢占
- 请求保持
- 循环等待
- 防止死锁的4个层次
- 预防死锁:破坏个必要条件
- 避免死锁: 银行家算法,防止系统处于不安全状态
- 检测死锁: 画资源分配图,用死锁定理
- 解决死锁: 剥夺资源,撤销进程
- 银行家算法
- 对于进程发起的请求,试探性而不是真的分配资源给进程,然后判断系统是否处于不安全状态,若是则不分配
- 死锁本质原因
- 进程描述与控制:
- (2) 内存管理
- 多级存储结构
- 程序的装入与链接
- 连续分配方式 (不常用)
- 单一分配
- 固定分区分配
- 动态分区分配
- 可重定位分配
- 离散分配
- 实现真的 小内存大程序: 按需一点一点地把程序搬到内存,不需要的暂时移出内存
- 整体对换 (不常用)
- 对换空间管理 (磁盘):
- 文件区: 主要是不与内存交互的文件,为了效率,直接用 连续分配方式
- 对换区: 经常和内存交互,为了提高交换效率,采用 离散的分配方式
- 分页
- 原理: 用户的程序地址空间 分页,内存分物理块,一页=一块
- 优点: 提高内存的利用率 (因为强制把用户程序的内存空间按照 内存物理分块 来 分割,编程很不方便,但是内存利用几乎无碎片)
- 分段
- 原理: 将用户程序地址空间按照 功能 分段,内存内部再适应 用户程序段
- 优点: (1) 用户编程方便,可以按照功能分段,(2) 分段共享,分段保护,(3) 动态增长,动态链接以段为单位
- 分页 vs. 分段
- 页大小是系统确定的,固定的;段大小是用户功能决定的,不固定
- 页的作业地址空间是一维的,页号-+快号;段的作业地址空间是二维的,段号+段长+基址
- (3) 虚存管理
- 本质: 通过 请求 调入和置换 在逻辑上 实现 内存扩容
- 常规存储 vs. 虚拟存储
- 常规: 一次性+驻留性,一次性把作业调入内存,并且驻留到作业完成
- 虚拟: 多次性+对换性+虚拟性
- 实现:
- 硬件系统: 请求分页的页表机制 + 缺页中断机构 + 地址变换机构
- 软件系统: 请求调页的软件 + 页面置换的软件
- 流程: 请求分页 -> 缺页中断 -> 地址变换 -> 请求调页 ->页面置换
- 请求分页的存储管理 (重点中的重点)
- 请求分页的页表机制
- 缺页中断机构
- 地址变换机构
- 请求调页的软件
- 3种内存分配策略
- (1) 固定分配局部置换
- (2) 可变分配局部置换
- (3) 可变分配全局置换
- 页面置换的软件
- 调页策略3问
- (1) 何时?请求调页
- (2) 何处?先查辅存的对换区,再查文件区
- (3) 怎么做?
- 页面置换算法 (重要)
- 最佳置换: 提供一个理想的 baseline metric
- 先进先出
- 最近最久未使用
- 最少使用
- CLOCK (最近未使用)
- 页面缓冲置换算法:累积再一起写到外存,减少IO次数
- 抖动和工作集
- 本质: 还是僧多粥少,进程多而可用物理块少了,所以频繁地缺页中断,换入换出,时间都浪费在置换上
- 工作集: 某段时间内,被访问页面的集合
- (4) IO
2.进程管理
2.1 进程描述-进程的创建/销毁/阻塞/唤醒
- 进程描述与控制:
- 定义了3个含义,
- 程序加上数据 在cpu领导下的一次执行的动态过程
- OS分配资源比如cpu-内存(但不是调度而是分配)的基本单位,每个进程都有自己独立的内存空间和其他资源
- 所以自然地有4大特点:动态性-独立性-并发性-异步性 (独立->并发->异步)
- 3个核心结构: 程序+数据+PCB,PCB就是进程的身份证,保存了进程的一切信息: (1)标识符, 家族(父进程与子进程), 程序与数据的位置, 当前进程的上下文信息比如cpu状态,堆栈指针,程序计数器等,进程的资源清单,下一个PCB的连接指针
- 4个核心状态是: 就绪 - 阻塞 - 执行 (处于不同队列,仅仅只有执行阶段才得到cpu搞事情)
- 无主动挂起
- 分析的核心是:怎样才能 回到 就绪状态?从就绪开始又回到就绪
- 就绪了,拿到cpu 就运行,运行中发现时间片到了就回到就绪
- 运行时发现IO就被阻塞,阻塞时发现IO完成就回到就绪
- 无主动挂起
- 定义了3个含义,
![ec2427bc8db656de4892ccd64c9a4433.png](https://i-blog.csdnimg.cn/blog_migrate/64334b2011d915639a9d420f04b4a295.png)
-
-
- 有主动挂起 (有点繁杂,眼熟即可)
- 以活动就绪为核心,挂起的核心是:(1) 将就绪态分为:活动就绪(+cpu就能运行那种)+静止就绪(必须要激活回到活动就绪,而且它唯一的转移就是 变成活动就绪); (2) 自己挂起自己,和阻塞是两码事(阻塞是因为IO而被迫中止)
- 用手遮住 右边的 静止就绪和静止阻塞,就和上面的 简单的3状态转移完全相同了, 然后再补充 静止就绪和静止阻塞 两个状态并在 转移边上加上条件
- 有主动挂起 (有点繁杂,眼熟即可)
-
![a7e5850a791bf76e9cad1569093423a1.png](https://i-blog.csdnimg.cn/blog_migrate/fb54216a354c5f134212be5128dce3b0.jpeg)
- 创建与销毁
- 创建的时机?
- 系统内核要创建(用户登录->作业调度->提供服务->应用发起请求);进程自己要创建其他进程
- 创建的过程?
- 从空闲队列摘一个节点创建空白PCB即身份证->为新进程分配资源比如内存-cpu-文件等->初始化PCB->插入就绪队列 (类比新生入学的 发学生证->发物资->初始化信息->信息入库)
- 销毁的时机?
- 正常结束/异常结束/外界干扰
- 销毁的过程?
- 找到PCB并获得进程的状态 -> 根据不同状态用不同策略关闭进程 (比如运行态置为就绪态,比如有子进程递归销毁子进程) -> 回收资源(cpu,内存等) -> PCB也回收并将此节点挂到空闲队列
- 创建的时机?
- 阻塞与唤醒
- 阻塞的时机?
- 等待IO完成 (泛化地讲就是等待某个事件完成)
- 请求共享资源失败 (泛化地讲就是等待某个资源完成)
- 阻塞的过程?
- 调用阻塞原语block -> PCB状态由运行改为阻塞 -> 加入到某事件的阻塞队列
- 唤醒的时机?
- 无非是 等待的资源(比如请求的共享资源获得了) 或 等待的事件(比如等待IO完成了) 满足了
- 唤醒的过程?
- 从阻塞队列移除 -> PCB状态由阻塞变就绪 -> 加入到就绪队列
- 阻塞的时机?
- 挂起与激活
- 简单了解几个case即可: 活动就绪->静止就绪,活动阻塞->静止阻塞
2.2 并发: 多进程-进程间同步/多线程
- 多进程之间的同步互斥的制约关系
- 互斥:两个进程争夺某个互斥访问的共享资源
- 同步的一个经典例子: 生产者消费者,他们不需要竞争共享资源,但是必须要遵守一个先后顺序才能共同完成一个任务 (必须生产者先生产,消费者才能消费)
- 互斥之临界资源
- 互斥访问-不可抢占的资源,比如 硬件的临界资源(打印机-磁带),软件的临界资源(数据文件,信号量)
- 互斥之临界区
- 某段只能互斥访问的代码段,进入退出分别要做 PV操作 (P操作进入临界区-在临界区访问临界资源-V操作退出临界区)
- 进程间同步的机制
- 名字虽然是进程同步,实则是 进程间同步与互斥 (别被名字骗了)
- 16字真言: 空闲让进-忙则等待-有限等待-让权等待
- 空闲与忙指的是,临界资源的被访问状态
- 有限等待设置了时间限制,避免了死等
- 让权等待的含义是,如果某个进程需要等待什么事件,那就让出临界区的权利去外面等待,而不是 占着临界区等待很长时间
- 信号量机制 (繁杂,简单case了解下)
- 整形信号量-记录型信号量-AND型信号量-信号量集
2.3 cpu调度
- 调度的目标: (个人觉得是核心)
- 资源利用率要高
- 公平
- 三级cpu调度层次 + 三种调度队列模型
- 三级cpu调度层次: 高级(作业)->中级(内存)->低级(进程)
- 三种调度队列模型: 仅包含作业调度的模型 -> 作业+进程调度的模型 ->三级层次都有的调度模型
- 作业调度
- 先来先服务
- 优点: 利于长作业
- 缺点: 不利于短作业 (等待时间比运行时间还长)
- 短作业优先
- 优点: 有利于短作业,能降低所有作业的平均等待时间(本质是抑制了长作业)
- 缺点:不利于长作业,提前预知作业运行时间不一定可行,未考虑其他因素(比如重要性)
- 高优先权优先
- 高响应比优先
- 先来先服务
- 进程调度
- 时间片轮转
- 多级反馈队列(MFQ)
- 多个就绪队列
- 对于每个队列,按优先级调度,第一优先级空闲才调度第二优先级 (大范围:优先级)
- 每个队列内部 采用 先来先到,时间片轮转 (小范围内部:先来先到-时间片轮转)
- 实时调度
- 目标: 实时-确保DDL,但也分硬实时和软实时,看赶不到DDL的后果严重性评判 (导弹发射 vs. 卖火车票)
- 基本条件:(1) 提供确保DDL的必要信息比如任务到达时间-处理时间等,(2) 系统处理能力强,(3) 抢占式调度,(4) 快速切换的机制,不然切换时间太长没意义
2.4 死锁 (重点中的重点)
- 死锁现象
- 死锁原因
- 本质原因:僧多粥少,进程数大于资源数
- 泛泛谈下原因: (1) 竞争的是不可抢占资源, (2) 竞争的顺序不当
- 造成死锁的4个必要条件 (同时满足才会发生死锁)
- 互斥访问
- 不可抢占
- 请求-保持
- 循环等待
- 处理死锁的4个层次
- 预防死锁:破坏4个必要条件的任意一个即可
- 互斥访问没法破解
- 不可抢占的破解:不允许就主动释放,不让别人请你释放(别人没法抢占你,你就自己释放)
- 请求保持:使用AND型信号量,禁止请求的时候还保持了互斥资源
- 循环等待:进程编号,防止成环
- 避免死锁: 银行家算法,避免系统进入不安全状态
- 检测死锁:画资源分配图,用 死锁定理 (S型)
- 解除死锁:剥夺资源,撤销进程
- 预防死锁:破坏4个必要条件的任意一个即可
- 银行家算法
- 当进程请求资源时,先试探性而不是真的分配资源给该进程,然后判断系统是否会处于不安全状态,如果是则不分配
- 系统不安全状态的判断:
![6546d84c60978f0b115ea90349586ddf.png](https://i-blog.csdnimg.cn/blog_migrate/b96ed114114eec9f873ce10e1216ec75.jpeg)
3.内存管理
3.1 多级存储结构
- cpu寄存器 -> 内存 ->辅存
3.2 程序的链接与装入
- c程序的执行过程: xxx.c (+编译) ->xxx.obj (+链接) -> xxx.exe (+装入) 运行了
- 经历了 编译-链接-装入
- 链接 (将各种库函数和目标模块xxx.obj整合在一起,形成可执行的xxx.exe)
- 静态链接:装入前就把 xxx.obj 链接为 xxx.exe
- 装入时链接: 一边装入一边把 xxx.obj 链接为 xxx.exe
- 运行时链接: 直到运行需要,才把 xxx.obj的一部分链接为 xxx.exe
- 装入 (把程序载入到内存的某个地址)
- 绝对装入: 程序中的逻辑地址即物理地址,编译后就有了绝对地址,最不灵活一种,基本不用
- 可重定位装入: 静态重定位,装入时确定 绝对地址
- 动态运行时装入: 运行时才确定绝对地址,使用 重定位寄存器实现
3.3 连续分配方式
- 单一连续分配:基本不用,所有内存都给了一个作业
- 固定分区分配:
- 原理: 将用户内存区均等/不均等 分成若干个分区
- 缺点: 容易造成分区内的小碎片,无法利用
- 动态分区分配
- 原理: 用户内存区不提前分区,而是等待作业,根据不同分配策略来分配一段空间
- 算法:
- 首次适应: 找到比自己需求大的一个分区,就申请拿到
- 循环首次适应: 优先找 上一次分配的分区的 下一个分区 (减少碎片)
- 最佳适应: 空闲分区按照容量排序再派给作业,但是产生小容量的碎片
- 缺点: 分区内碎片减少了,分区之间的碎片增大
- 可重定位分配
- 原理: 将动态分区的外碎片,通过作业的移动,进行重定位,以利用
- 实现: 重定位寄存器;若找到比自己需求大的新空间 就分配
3.4 离散分配
-
- 实现真的 小内存大程序: 按需一点一点地把程序搬到内存,不需要的暂时移出内存
- 整体对换 (不常用)
- 对换空间管理 (磁盘):
- 文件区: 主要是不与内存交互的文件,为了效率,直接用 连续分配方式
- 对换区: 经常和内存交互,为了提高交换效率,采用 离散的分配方式
- 分页
- 原理: 用户的程序地址空间 分页,内存分物理块,一页=一块
- 优点: 提高内存的利用率 (因为强制把用户程序的内存空间按照 内存物理分块 来 分割,编程很不方便,但是内存利用几乎无碎片)
- 分段
- 原理: 将用户程序地址空间按照 功能 分段,内存内部再适应 用户程序段
- 优点: (1) 用户编程方便,可以按照功能分段,(2) 分段共享,分段保护,(3) 动态增长,动态链接以段为单位
- 分页 vs. 分段
- 页大小是系统确定的,固定的;段大小是用户功能决定的,不固定
- 页的作业地址空间是一维的,页号-+快号;段的作业地址空间是二维的,段号+段长+基址
4.虚存管理 (虚拟内存)
- 本质: 通过 请求 调入和置换 在逻辑上 实现 内存扩容
- 常规存储 vs. 虚拟存储
- 常规: 一次性+驻留性,一次性把作业调入内存,并且驻留到作业完成
- 虚拟: 多次性+对换性+虚拟性
- 实现:
- 硬件系统: 请求分页的页表机制 + 缺页中断机构 + 地址变换机构
- 软件系统: 请求调页的软件 + 页面置换的软件
- 流程: 请求分页 -> 缺页中断 -> 地址变换 -> 请求调页 ->页面置换
- 请求分页的存储管理 (重点中的重点)
- 请求分页的页表机制
- 缺页中断机构
- 地址变换机构
- 请求调页的软件
- 3种内存分配策略
- (1) 固定分配局部置换
- (2) 可变分配局部置换
- (3) 可变分配全局置换
- 页面置换的软件
- 调页策略3问
- (1) 何时?请求调页
- (2) 何处?先查辅存的对换区,再查文件区
- (3) 怎么做?
- 页面置换算法 (重要)
- 最佳置换: 提供一个理想的 baseline metric
- 先进先出
- 最近最久未使用
- 最少使用
- CLOCK (最近未使用)
- 页面缓冲置换算法:累积再一起写到外存,减少IO次数
- 抖动和工作集
- 本质: 还是僧多粥少,进程多而可用物理块少了,所以频繁地缺页中断,换入换出,时间都浪费在置换上
- 工作集: 某段时间内,被访问页面的集合
http://5.IO接口管理: 不重要,再看是否需要整理
其他暂时跳过
6.参考
- [1]. 大A馆长:《计算机操作系统》复习 (一个总结的特别好的脑图)
- [2]. 凡希:考研操作系统知识整理
- [3]. 浅谈进程同步和互斥的概念 - CareySon - 博客园 (对进程间的同步互斥的现象解释地很清楚)
- [5]. 一句话+一张图说清楚--银行家算法_土豆洋芋山药蛋的博客-CSDN博客 (银行家算法)