模拟实现基本分页存储管理_[CS基础-OS-基本原理]-1

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完成就回到就绪

ec2427bc8db656de4892ccd64c9a4433.png
      • 有主动挂起 (有点繁杂,眼熟即可)
        • 以活动就绪为核心,挂起的核心是:(1) 将就绪态分为:活动就绪(+cpu就能运行那种)+静止就绪(必须要激活回到活动就绪,而且它唯一的转移就是 变成活动就绪); (2) 自己挂起自己,和阻塞是两码事(阻塞是因为IO而被迫中止)
        • 用手遮住 右边的 静止就绪和静止阻塞,就和上面的 简单的3状态转移完全相同了, 然后再补充 静止就绪和静止阻塞 两个状态并在 转移边上加上条件

a7e5850a791bf76e9cad1569093423a1.png
  • 创建与销毁
    • 创建的时机?
      • 系统内核要创建(用户登录->作业调度->提供服务->应用发起请求);进程自己要创建其他进程
    • 创建的过程?
      • 从空闲队列摘一个节点创建空白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型)
    • 解除死锁:剥夺资源,撤销进程
  • 银行家算法
    • 当进程请求资源时,先试探性而不是真的分配资源给该进程,然后判断系统是否会处于不安全状态,如果是则不分配
    • 系统不安全状态的判断:

6546d84c60978f0b115ea90349586ddf.png

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博客 (银行家算法)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值