硬件

Linux虚拟内存和缺页中断-腾讯云开发者社区-腾讯云

进程不需要所有块都在内存里 只需下一条指令所在块&待访问的下一 个数据单元所在块在内存中 就可以暂时正常执行

处理器访问一个不在内存中的逻辑地址时:

  1. 产生一个中断 ⇒ 出现了内存访问故障 ⇒ 进程置阻塞态
  2. 操作系统必须把包含引发访问故障的逻辑地址的进程块读入内存。为此,操作系统产生一个磁盘I/O读请求。
  3. 产生I/O请求后,在执行磁盘I/O期间,操作系统可以调度另一个进程运行。需要的块读入内存后,产生一个I/O中断,控制权交回给操作系统,而操作系统则把由于缺少该块而被阻塞的进程置为就绪态

根本做法:大进程短时间内仍然只需正在执行的一小段放入内存 ⇒ 内存中保留更多进程

Untitled
  • 系统抖动问题:在稳定状态 内存的几乎所有空间都被进程块占据,处理器和操作系统能直接访问到尽可能多的进程 ⇒ 当操作系统读取一块时 必须把另一块换出 而如果这一块正好在将要在用到之前换出 操作系统就不得不很快地把它取回 ⇒ 消耗时间在交换而不是执行
  • 局部性原理: 时间局部性是指同一个数据值在短时间内被多次访问的趋势 空间局部性是指一旦某个数据被访问 它附近的存储单元也可能很快被访问
  • 几种格式:Untitled
    • P – 是否在内存中
    • M – 修改位
  • 虚存的优点
    • 内存中保留多个进程
    • 支持运行大于主存的程序
    • 解除用户和主存之间不必要的紧密联系
    • 支持更有效的系统并发度

分页

同样每个进程唯一页表

一个进程可能只有部分页在内存中

  • 对程序员透明
  • 虚拟地址 → 物理地址Untitled
  • 大进程 需要的页表项过多时 两级层次页表Untitled
  • TLB
    • 每次虚存访问都需要两次内存访问(取页表&取数据)内存访问时间长 ⇒ 高速缓存
    • hit直接用 miss再查 同时存入TLB 节省部分时间
    • 查到页表项后
      • 若P=1 则已经在内存中 直接形成物理地址 更新TLB
      • 若P=0 缺页中断 离开硬件作用范围 调用操作系统 由操作系统负责装入所需要的页 从辅存(硬盘)中加载页面到内存中
Untitled
Untitled
Untitled
  • 页尺寸
    • 页尺寸减小 进程所需页的数量增加 页表更大 页尺寸增加 内部碎片增加
    • 页尺寸对缺页率的影响UntitledUntitled

分段

  • 每个进程唯一段表
  • 两个控制位 P&M
  • 对程序员可见
  • 页号+偏移量Untitled

段页式

每个进程都使用一个段表和一些页表

先将内存划分为段 然后再在段中划分大小相等页

Untitled

页的长度等于内存中的页框大小

若某段的长度小于一页 则该段只占据一页

从程序员的角度看 逻辑地址仍然由段号和段偏移量组成 从系统的角度看 段偏移暈可视为指定段中的一个页号和页偏移量

先通过段表查找该逻辑地址属于哪个段,然后通过页表查找该逻辑地址在该段中的偏移量对应的物理地址

软件

  • 三个因素:
    • 是否使用虚存技术
    • 是使用分页还是使用分段,或同时使用二者
    • 为各种存储管理特征采用的算法
    • 前两个取决于硬件 算法取决于软件
  • 目标:缺页中断发生的频率最小 决定置换和交换的开销最小
  • 不存在最优

读取策略

何时被读入内存

  • 请求分页
    • 只有当访问到某页中的一个单元时才将该页取入内存
    • 进程首次启动时会产生大量缺页中断
    • 后续由于局部性原理 缺页情况会逐渐减少
  • 预先分页
    • 启动进程时一次性读取的页比实际更多
    • 可能有的读取的不会用到

放置策略

一个进程块驻留在实存中的什么位置

在分页和段页式中不重要 因为地址转换硬件和内存访问硬件能以相同的效率为任何页框组合执行相 应的功能

在分段式和非一致存储访问系统中很重要 (性能很大程度上取决于数据驻留的位置与使用数据的处理器间的距离)

置换策略

内存已满后新页换出哪个旧页(产生缺页中断需要读取新页时)

一个页面需要被加载时 先检查缓冲区 如果没有就需要置换 → 在缓冲区中选择一个页面将其替换出物理内存(在缓冲区中循环选择页面进行置换)

页框锁定(约束条件)不被置换 操作系统内核等就是被锁定的 页框中有锁定位

Untitled
  • OPT
    • 置换下次访问距当前时间最长的那些页
    • 缺页中断最少
    • 要预知未来 ⇒ 不可能实现 ⇒ 作为评判标准
  • LRU
    • 置换最长时间未被引用的页
    • 添加时间戳 而且需要每次访问更新 ⇒ 开销较大
  • FIFO
    • 实现简单 一个指针就行
    • 性能一般
  • 时钟策略 CLOCK
    • 给每个页框关联一个称为使用位的附加位
    • 首次装入&后续访问(如果待访问的已存在 就把已存在的那一位置1)时 使用位=1
    • 寻找替换的过程中 1全部置0
    • 第一个使用位已经为0的页被替换
    • 置换后指针指向被换的下一个页Untitled
    • 增强型时钟
      • 最近未访问,未修改(u=0;m=0) 最近访问,未修改(u=1;m=0) 最近未访问,修改(u=0;m=1) 最近访问,修改(u=1;m=1)
      • 优先换出未访问 其次换出未修改 u>m
  • 页缓冲
    • 基于FIFO改进
    • 置换修改过的页代价更大 需要写进辅存
    • 若未被修改,则分配到空闲页链表中
    • 若己被修改,则分配到修改页链表中
    • 移动的只是该页所对应的页表项 不移动内存中的实体 移动后的页表项放置在空闲页链表中或修改页链表中

驻留集管理

进程对应内存

双矛盾因素:总页数少→缺页率高 vs. 总页数多→内存中程序少所以交换时间长

  • 驻留集大小
    • 固定分配策略
      • 执行时分配固定数量的页框
      • 缺页中断时 当前进程的一页被进程需要的一页替换
    • 可变分配策略
      • 允许页框在进程的生命周期不断变化
      • 缺页率高 ⇒ 多分配页框 反之
      • 需要对活动评估 有开销
  • 置换范围:局部置换策略(缺页进程)vs. 全局置换策略(所有未锁定的进程)Untitled可变分配+全局范围用的最多
  • 清除策略
    • 何时将已修改的写回辅存
    • 请求式清除
      • 被置换时清除
      • 缺页中断时需要两步(清除+读入)降低效率
    • 预约式清除
      • 将已经被修改过的页提前统一写回到磁盘中
      • 再次被修改就白写回了
      • 仍留在内存
    • 最优解是页缓冲

加载控制

系统并发度:内存中的进程数量

Untitled

并发度小 → 过多进程阻塞 并发度大 → 进程的平均驻留集大小不够 频繁缺页中断 → 系统抖动

About the Author

XFishalways

Fisher不钓鱼 川大21级在读 网络空间安全专业 7年前的围棋业余5段 素描彩铅水粉国画书法童子功拥有者 Hala Madrid Letsgo Pat Self-Commentator Analyzer ing 七年前的业余5段 AI Skipper nparadigm申工智能yyds 飞禽岛少年Lee Sedol

View All Articles