【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.操作系统内存管理:分页机制+多级页表+快表来实现;


【0】分页的问题

1)分页的问题(大页表):为了提高内存利用率,页应该小,页小了,页表项就多了,页表就大了;(页是4K,每个段最多浪费4K)

  • 问题:页表大了不利于查找,且大页表占用内存多;

【例】页表结构与大页表

页号

页框号

保护

0

5

R

1

1

R/W

2

3

R/W

3

6

R

  • 如总内存大小2^32=4G,每页大小4K,则页表项数量=4G/4K=1M 即100万个页表项;
  • 又每个页表项占用4个字节,所以含有100万个页表项的页表占用的总内存为 4M;
  • 又若系统并发执行10个进程,每个进程页表项4M,所以需要40M;那如果系统并发100个进程,则需要400M存储页表,这会导致内存利用率低;

【1】大页表的解决方法1(只是尝试):只存放用到的页

1)页表只存放用到的页(页表号不连续

实际上,大部分逻辑地址不会用到;
把不会用到的逻辑页号从页表中删除,从而减少了当前进程的页表大小;即,用到的逻辑页才有页表项;

2) 用到的逻辑页才有页表项
因为删除了不使用的逻辑页号,所以页号是不连续的(页号0 1 3 )。如下。

页号

页框号

保护

0

5

R

1

1

R/W

3

3

R

在计算页基址时,需要从页表中根据页号查找页框号,进而计算出该页的物理内存基址。
3)如何根据页号查找页框号?

  • 顺序查找,折半查找都比较慢;
  • 如总内存大小为4M,页表项个数为4M/4K=1K;采用顺序查找需要1K次,采用折半需要 log(2^10)=10次;也就是说每执行一条指令都需要10次访存,1次主存访问耗费约200ns,则10次需要2us;这会严重影响指令执行速度;

【小结】

  • 页号必须要连续,这样才可以立即定位到页表项。如页表项基址+3就可以得到页号为3的页表项(而不用顺序或折半查找);
  • 这又回到了刚开始的问题,即32位地址空间 + 4K页面 + 页号必须连续 => 导致了2^20个页表项 => 导致了大页表占用过多内存,造成浪费;

所以解决方法1中的尝试是失败的。

进一步的,我们得出需要解决的问题是:

  • 页号连续,且页表占用内存少;
  • 用书的章目录和节目录来类比思考;

【2】 大页表的解决方法2(尝试):多级页表

【2.1】多级页表

由单级页表转为多级页表;
即多级页表,页目录表(章)+页表(节);

1)多级页表具体分配
指令中的逻辑地址结构如下:

10 bits

10 bits

12 bits

页目录号

页号

Offset偏移量

  • 步骤1:根据页目录号从页目录表中查询到页表基址;
  • 步骤2:根据页号从页表(通过页表基址确定)中查询到页框号(物理内存页号);
  • 步骤3:根据页框号可以计算出物理内存页基址(具体是页框号乘以4K),用页基址加上逻辑地址偏移量得到物理内存地址;

因为页目录号,页号都是连续的,所以页目录号及页号的查询时间复杂度是O(1);

2)利用多级分页的地址翻译步骤

【说明】图解说明:

  • 说明1)1个页目录项(章)指向1k个内存页,每个内存页4K,所以1个页目录项指向4M内存;所以1K个页目录项就可以映射容量为4G的内存空间;
  • 说明2)页目录表中,进程使用了3个页目录项,即使用了4G内存中的12M内存;页目录表与页表占用的总内存大小=1K*4 + 3 * 1K*4 = 16K;(每个页目录项与每个页表项均占用4个字节,因为32位地址空间)
  • 说明3)需要注意的是,如果内存使用单级分页,需要4G/4K=1M个页表项,每个页表项占用4个字节,则单级分页下的页表占用内存大小为4M;

【小结】

  • 在内存总大小4G的基础上,占用12M内存的程序,采用多级分页时页表占用16K 远远小于 单级分页时的4M


【2.2】多级页表优缺点

1)多级页表优点:

  • 多级页表既保证了页表表项的连续性,使得查找起来非常快(时间复杂度O(1));
  • 又保证了内存中存储的页表少了,减少了内存浪费,提高了内存使用率;

2)多级页表缺点

  • 多级页表增加了访存速度,特别64位系统(因为64位系统的多级页表有5,6级);
  • 多级页表,每增加一级,访存次数就会加1; 所以 64位系统的多级页表访存次数约为5,6次;
  • 多级页表的级数越多,访存越多,效率越低(级数越多,类比书的多层目录),这会造成指令执行效率低;

针对多级页表缺点,引入了快表


【3】 快表(指的是TLB寄存器)

1)快表:

  • 也叫TLB,TLB是一组相联快速存储,是寄存器;
  • TLB,即Translation lookaside buffer,又称为翻译后备缓冲区寄存器;
  • 通过TLB可以快速找到最近使用的逻辑页映射的物理页号;

2)TLB存储的内容(记录的是最近使用的逻辑页映射的物理页号)如下:

有效

页号(无序)

修改

保护

页框号(物理页号)

1

140

0

R

56

1

20

1

R/W

23

0

19

0

R/W

29

1

21

0

R

43

因为寄存器访问速度快,可以设计 TLB寄存器的硬件逻辑,使得可以一次访存就可以根据页号查询出页框号(物理页号),最后得到物理地址;


【3.1】基于快表的地址翻译

1)基于快表的地址翻译步骤

  • 步骤1: 根据逻辑地址的页号,查询一次TLB寄存器就可以得到页框号(物理页号);
  • 步骤2: 若快表TLB不存在页框号(未命中),则查询多级页表,并把查询结果送入TLB存储作为缓冲用于后续地址翻译;

小结:快表+多级页表合在一起形成的结构,保证了查询(翻译物理地址)时间快,页表项连续,减少了内存资源浪费;

2)这也充分体现了操作系统折中思想;通过把一些技术组合在一起,使得访问时间不错,空间利用也不错;具体是:

  • 多级页表是减少了空间浪费,降低了空间复杂度,访问时间还可以,但还想提高页表查询速度;
  • TLB是提高了页表查询速度,降低了时间复杂度;
  • TLB可以弥补多级页表(特别64位系统)访存耗时,慢的缺点;

【3.2】TLB如何保证高命中率

1)TLB得以发挥作用的原因:保证高命中率;

【说明】公式说明:

  • 有效访问时间等于命中时的访问时间 + 没有命中时的访问时间;
  • 上图有效访问时间式子中的符号解释:
  • HitR 表示 命中率;
  • (1-HitR)表示 未命中率;
  • TLB 表示访问寄存器的时间;通常为10ns (当然图中给出的是20ns,数量级相同)
  • MA表示访问内存的实际; 通常为 200ns  (图中给出的是100ns,数量级相同)
  • 可以看到: 命中率越高,则访问时间才接近于1次访存的时间;

2)如何提高TLB命中率

  • TLB越大越好, 但TLB很贵,折中处理是 TLB可以存储的页表项数量范围是 [64,1024];

3)为什么 TLB存储的页表项数量可以在 64~1024之间 ?
原因:

  • 程序的地址访问存在局部性
  • 因为访问局部性,所以程序用的是固定的那几个逻辑页号;
  • 最近访问的逻辑页与物理页映射关系会送入TLB存储,所以TLB的命中率会很高;
  • 补充:程序多体现在循环,顺序结构;

18.多级页表与快表相关推荐

  1. 操作系统(九) -- 多级页表与快表

    文章目录 单级页表的缺点 多级页表的提出 第一种尝试:页表里面只存放用到的页 第二种尝试:多级页表,页目录表+页表 多级页表的缺点 相连快速存储TLB(快表) 小结 参考资料 单级页表的缺点 前面说了 ...

  2. 内存管理<原理篇>(五、页表和快表)

    文章目录 5.1 页表 5.1.1 页表介绍 5.1.2 页表项 5.2 页表结构 5.2.1 多级页表 5.2.2 哈希页表 5.2.3 倒置页表 5.3 快表 5.3.1 局限性原理 5.3.2 ...

  3. 虚拟内存,页表,快表,多级页表,倒排页表

    虚拟内存 尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,还有另一个问题需要解决:管理软件的膨胀(bloatware).虽然存储器容量增长快速,但是软件大小的增长更快.需要运行的程序往往大到内存 ...

  4. (计算机组成原理)第三章存储系统-第七节1:页式存储器、页表及快表

    文章目录 一:页式存储器 二:逻辑地址和物理地址 三:页表和地址变换过程 (1)页表 (2)快表 一:页式存储器 前面说过主存和Cache之间是以块作为数据的传输单位的 我们知道,应用程序运行时需要加 ...

  5. 快表、页表和cache之间的关系

    快表.页表和cache之间的关系 偏移量的含义 全相联映射快表命中[快表是集成在CPU里的] 全相联映射快表未命中[二级页表] 四路组相连映射[TLB] 23年复习 引入部分 单级页表[一个进程一张页 ...

  6. 【操作系统基础】页表 快表 多级页表

    文章目录 页表 页面的大小 页表特性 PTBR--寄存器 快表 TLB 命中率 基于页表的保护与共享 多级页表 页表 为什么说分页的逻辑地址是一维的地址: 从下图我们可以看出,把一个程序分为等大的页面 ...

  7. 【学习笔记】第三章——内存 II(分页存储、快表与局部性原理、两级页表)

    文章目录 一. 分页存储概念 二. 地址转换 1)为什么页面大小为2的次幂? 三. 页表 1)页表项长度.页号"隐含" 四. 局部性原理与快表 五. 二级页表 1)单级页表存在的问 ...

  8. 操作系统的内存管理机制(连续分配管理、页式、段式、段页式、快表、二级页表)

    来源:https://www.bilibili.com/video/BV1YE411D7nH 操作系统的内存管理机制(连续分配管理.页式.段式.段页式.快表.二级页表) 内存被分为系统区和用户区,系统 ...

  9. 操作系统-内存管理(快表的地址变换机构,两级页表,虚拟内存的基本概念,基本页式管理下的页表和页面置换算法)

    文章目录 1.快表地址变换机构 2. 两级页表 3. 虚拟内存的基本概念 基本分页存储管理 1.快表地址变换机构 快表,又称联想寄存器(TLB,translation lookaside buffer ...

最新文章

  1. 负离子发生器模块 ANION GENERATOR
  2. Android 8.1 源码_启动篇(一) -- 深入研究 init(转 Android 9.0 分析)
  3. 用Electron开发企业网盘(二)--分片下载
  4. jboss5+EJB3+MDB Queue
  5. java 源码分析_Java 源代码编译成 Class 文件的过程分析
  6. Apt 命令解说(apt-get update、apt-cache search package、apt-get install package、apt-get remove )
  7. Python下使用optparse模块实现对多个文件进行统计【二】
  8. Python面向对象程序设计中属性的作用与用法
  9. c++ 后台 sendstring_苹果狂杀微信后台,微信官方出必杀技!
  10. 从零开始学安全(二十三)●用PHP编写留言板
  11. mysql一对多前端实现_django一对多模型以及如何在前端实现详解
  12. DS18B20的CRC验证算法
  13. 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记
  14. 初探区块链的挑战,应用和发展
  15. java的memset怎么写_memset函数使用详解
  16. iOS笔记-performSelector的探索
  17. Mongo Shell 文档搜索
  18. matlab二维doa估计,阵列信号处理,一维、二维DOA估计
  19. 数控机床远程运维监控解决方案
  20. 鸿蒙开发板HI3861 利用蜂鸣器播放音乐 open Harmony1.0.0(附cmsis_os2.h源码)

热门文章

  1. STC89C52RC定时器2串口通信
  2. 线上服务器崩溃,线下门店破万,社交新宠「剧本杀」是如何迅速爆火的?
  3. linux怎么读取光盘文件,linux怎么读取光盘里的文件?
  4. 简单好玩的vue小游戏,网页小游戏
  5. 蓝桥杯 问题 1094: 字符串的输入输出处理(c++实现)
  6. 语言学句法分析树形图怎么画_教你如何能画语言学树型图
  7. 2021暑假集训-个人赛11
  8. 蓝桥学习 PREV-55
  9. runas 显示740 所需的操作需要提升的解决方法
  10. 2021-07-17【普及组】模拟赛C组