目录

  • 非连续内存分配的必要性
  • 连续内存分配的缺点
  • 非连续内存分配的优点
  • 非连续内存分配的缺点
  • 非连续内存分配
  • 分段寻址方案
  • 分页(Paging)
  • 帧(Frame)**
  • 页表(Page Table)
  • 分页机制的性能问题

非连续内存分配的必要性

连续内存分配的缺点

  1. 分配给一个程序的物理内存是连续的
  2. 内存利用率低
  3. 有外碎片 / 内碎片的问题

非连续内存分配的优点

  1. 一个程序的物理地址空间是非连续的
  2. 更好的内存利用和管理
  3. 允许共享代码与数据(共享库等…)
  4. 支持动态加载和动态链接

非连续内存分配的缺点

1.建立虚拟地址和物理地址的转换难度大

  • 软件方案
  • 硬件方案(采用硬件方案) : 分段 / 分页

非连续内存分配

分段(Segmentation)
段 : 在程序中会有来自不同文件的函数 ; 在程序执行时, 不同的数据也有不同的字段, 比如 : 堆 / 栈 / .bss / .data 等

**分段 : **更好的分离和共享
程序的分段地址空间如下图所示 :

分段寻址方案

逻辑地址空间连续,但是物理地址空间不连续,使用映射机制进行关联.
一个段 : 一个内存"块"
程序访问内存地址需要 : 一个二维的二元组(s, addr) → (段号, 地址)
操作系统维护一张段表, 存储(段号, 物理地址中的起始地址, 长度限制)
物理地址 : 段表中的起始地址 + 二元组中的偏移地址

分页(Paging)

分页地址空间**
划分物理内存至固定大小的帧(Frame)

  • 大小是2的幂, 512 / 4096 / 8192

划分逻辑地址空间至相同大小的页(Page)

  • 大小是2的幂, 512 / 4096 / 8192
    建立方案 → 转换逻辑地址为物理地址(pages to frames)
  • 页表
  • MMU / TLB

帧(Frame)**

物理内存被分割为大小相等的帧. 一个内存物理地址是一个二元组(f, o) → (帧号, 帧内偏移)

帧号 : F位, 共有2^F个帧
帧内偏移 : S位, 每帧有2^S个字节
物理地址 = 2^S * f + o

(例子 : 16-bit地址空间, 9-bit(512 byte) 大小的页帧 物理地址 = (3,6) 物理地址 = 2^9 * 3 + 6 = 1542)

  • 分页和分段的最大区别 : 这里的 S 是一个固定的数, 而分段中的长度限制不定

页(Page)
一个程序的逻辑地址空间被划分为大小相等的页. 页内偏移的大小 = 帧内偏移的大小 页号大小 <> 帧号大小
一个逻辑地址是一个二元组(p, o) → (页号, 页内偏移)
页号 : P位, 共有2^P个页
页内偏移 : S位, 每页有2^S个字节
虚拟地址 = 2^S * p + o

页寻址方案
操作系统维护一张页表, 页表保存了逻辑地址——物理地址之间的映射关系
存储 : (页号, 帧号)

  • 逻辑地址空间应当大于物理内存空间
  • 页映射到帧
  • 页是连续的虚拟内存
  • 帧是非连续的物理内存(有助于减少碎片的产生)
  • 不是所有的页都有对应的帧

页表(Page Table)

页表概述
每一个运行的程序都有一个页表

  • 属于程序运行状态, 会动态变化
  • PTBR : 页表基址寄存器

转换流程
CPU根据程序的page的页号的若干位, 计算出索引值index, 在页表中搜索这个index, 得到的是帧号, 帧号和原本的offset组成物理地址.

页表中还有一些特殊标志位

  • dirty bit,
  • resident bit, (0 : 对应的物理页帧在内存中不存在 ; 1 : 存在)
  • clock /reference bit

转换实例
16位地址的系统

  • 32KB的物理内存
  • 每页的 1024 byte

逻辑地址空间 : (4, 0) … (3, 1023)

页表 :

Flags | Frame nums
1 0 1 0 0 0 0 0 → 内存访问异常(可能要杀死程序)
0 1 1 0 0 1 0 0 → 页帧是4 偏移是 1023 → 物理地址 (4, 1023)

分页机制的性能问题

访问一个内存单元需要2次内存访问

  • 一次用于获取页表项
  • 一次用于访问数据

页表可能非常大

  • 64位机器如果每页1024字节, 那么一个页表的大小会是多少?(2^64 / 2^10 = 2^54 存放不下)
  • 每一个运行的程序都需要有一个页表

如何处理?

  • 缓存(Caching)
  • 间接(Indirection)访问

转换后备缓冲区(TLB)
缓解时间问题

Translation Look-aside Buffer(TLB) 是一个缓冲区. CPU中有快表TLB(可以将经常访问的页表存放在这边)

缓存近期访问的页帧转换表项

  1. TLB使用关联内存实现, 具备快速访问性能
  2. 如果TLB命中, 物理页号可以很快被获取
  3. 如果TLB未命中,对应的表项被更新到TLB中(x86的CPU由硬件实现, 其他的可能是由操作系统实现)

二级/多级页表
时间换空间

二级页表

  1. 将页号分为两个部分, 页表分为两个, 一级页号对应一级页表, 二级页号对应二级页表.
  2. 一级页号查表获得在二级页表的起始地址,地址加上二级页号的值, 在二级页表中获得帧号
  3. 节约了一定的空间, 在一级页表中如果resident bit = 0,可以使得在二级页表中不存储相关index,而只有一张页表的话, 这一些index都需要保留

多级页表

  • 通过把页号分为k个部分, 来实现多级间接页表, 建立一棵页表"树"

反向页表
解决大地址空间问题
目的 : 根据帧号获得页号
反向页表只需要存在一张即可

  1. 有大地址空间(64-bits), 前向映射页表变得繁琐. 比如 : 使用了5级页表
  2. 不是让页表与逻辑地址空间的大小相对应, 而是当页表与物理地址空间的大小相对应. 逻辑地址空间增长速度快于物理地址空间

基于页寄存器(Page Registers)的方案
存储 (帧号, 页号) 使得表大小与物理内存大小相关, 而与逻辑内存关联减小.
每一个帧和一个寄存器关联, 寄存器内容包括 :

  1. resident bit : 此帧是否被占用
  2. occupier : 对应的页号 p
  3. protection bits : 保护位

实例 :

  1. 物理内存大小是 : 4096 * 4096 = 4K * 4KB = 16 MB
  2. 页面大小是 : 4096 bytes = 4 KB
  3. 页帧数 : 4096 = 4 K
  4. 页寄存器使用的空间(假设8 bytes / register) : 8 * 4096 = 32Kbytes
  5. 页寄存器带来的额外开销 : 32K / 16M = 0.2%
  6. 虚拟内存大小 : 任意

优势 :

  1. 转换表的大小相对于物理内存来说很小
  2. 转换表的大小跟逻辑地址空间的大小无关

劣势 :

  • 需要的信息对调了, 即根据帧号可以找到页号
  • 如何转换回来? (如何根据页号找到帧号)
  • 在需要在反向页表中搜索想要的页号

基于关联内存(associative memory)的方案
硬件设计复杂, 容量不大, 需要放置在CPU中

  • 如果帧数较少, 页寄存器可以被放置在关联内存中

  • 在关联内存中查找逻辑页号

  • 成功 : 帧号被提取

  • 失败 : 页错误异常 (page fault)

限制因素:

  • 大量的关联内存非常昂贵(难以在单个时钟周期内完成 ; 耗电)

基于哈希(hash)的方案
哈希函数 : h(PID, p) 从 PID 标号获得页号

在反向页表中通过哈希算法来搜索一个页对应的帧号

  • 对页号做哈希计算, 为了在帧表中获取对应的帧号
  • 页 i 被放置在表 f(i) 位置, 其中 f 是设定的哈希函数
  • 为了查找页 i ,执行下列操作 :
    1.计算哈希函数 f(i) 并且使用它作为页寄存器表的索引, 获取对应的页寄存器
    2.检查寄存器标签是否包含 i, 如果包含, 则代表成功, 否则失败

【清华大学】深入理解操作系统(陈渝) 第四章相关推荐

  1. 【清华大学】操作系统 陈渝——Part6 全局页面置换算法

    [清华大学]操作系统 陈渝--Part6 局部页面置换算法 6.8 局部页面替换算法的问题,工作集模型 局部页面替换算法的问题 工作集模型 6.9 全局页面置换算法 1. 工作集页置换算法 2. 可变 ...

  2. 【清华大学】操作系统 陈渝 Part3 ——物理内存管理 之 连续内存分配

    [清华大学]操作系统 陈渝 Part3 --物理内存管理 之 连续内存分配 3.1计算机体系结构及内存分层 计算机体系机构 内存体系层次 管理内存方法 3.2地址空间 & 地址生成 地址空间定 ...

  3. 《深入理解分布式事务》第四章 分布式事务的基本概念和理论知识

    <深入理解分布式事务>第四章 分布式事务的基本概念和理论知识 文章目录 <深入理解分布式事务>第四章 分布式事务的基本概念和理论知识 一.分布式系统架构 1.简介 2.分布式事 ...

  4. 操作系统考研复习——第四章(文件管理)

    操作系统考研复习--第四章(文件管理) 4. 文件管理 4.1 文件管理基础 4.1.1 文件的概念 1. 数据项.记录和文件 2. 文件属性 3. 文件系统的接口 4. 文件的基本操作 5. 文件的 ...

  5. 操作系统课后答案第四章

    **操作系统课后答案** 第四章 存储器管理 1.为什么要配置层次式存储器? 答:设置多个存储器可以使存储器两端的硬件能并行工作:采用多级存储系统,特别是Cache 技术,是减轻存储器带宽对系统性能影 ...

  6. 【高级操作系统-陈渝】tendency_Of_OS---PerformanceReliabilityCorrectness

    目录 1.Performance 2.Reliability 3.Correctness 1.Performance 2.Reliability 3.Correctness

  7. 操作系统学习笔记 第四章:存储器管理(王道考研)

    本文章基于网课: 2019 王道考研 操作系统 考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com) 需要相关电子书的可以关注我的公众号BaretH后台回复操作系统 第一章:操作系 ...

  8. [深入理解Android卷一全文-第四章]深入理解zygote

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. ...

  9. [深入理解Android卷二 全文-第四章]深入理解PackageManagerService

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...

  10. 华文慕课北大操作系统陈向群第二章课后题解析

    1.(5分) 控制和状态寄存器用于控制处理器的操作,在某种特权级别下可以访问.修改.下列哪一个不是控制和状态寄存器 A. 程序计数器(PC) B. 指令寄存器(IR) C. 程序状态字(PSW) D. ...

最新文章

  1. docker run后台启动命令_Docker命令详解之run
  2. python基础教程第二版和第三版哪个好-最好的Python入门教材是哪本?
  3. 【Linux 内核】Linux 内核源码几个重要的入口源文件及函数介绍 ( 系统初始化 | 内存管理 | 虚拟文件系统 | 网络管理 )
  4. android 定位信息存哪,安卓手机便签系统存储位置在哪
  5. Spring 容器(Spring 的上下文)
  6. 爱奇艺的测试工程师笔试题
  7. grep 多模式匹配
  8. c语言复杂数据类型存储,C语言基础-复杂数据类型
  9. PHP九宫格翻牌抽奖,PHP 九宫格抽奖代码
  10. deepin下安装QT
  11. WEB程序设计 第7版.pdf
  12. 我应该怎么学习SAP?
  13. Python暂停的几种方法
  14. 50元打造双网卡负载均衡服务器(Network Load Balancing)
  15. UITextView内边距设置
  16. Linux树莓派实战案例论文,树莓派|树莓派使用实例之:2 Pi R
  17. 航天工程系统是什么?
  18. 广告系统架构:要啥自行车!
  19. 马云是唯一出现在西雅图科学馆名人栏的中国人
  20. java字符串转数组遍历,深入分析

热门文章

  1. windows共享 无法访问
  2. Office2010安装出错(Error1406)
  3. python-获取图片的exif信息
  4. (第二版)零基础入门Python小甲鱼-笔记-第一章-p2
  5. CSDN调整图片大小
  6. Centos linux 修改ip地址
  7. Typora上传图片终于解决了
  8. 服务端渲染SSR及实现原理
  9. 网络工程师职业发展方向和职业前景
  10. 老路用得上的商学课-61-80学习(读书)笔记