上一节 : 操作系统---内存管理(上)
大纲 :
思想 : 把内存分为一个个相等的小分区, 再按照分区大小把进程拆分成一个个小部分.
页框 :
页面 :
注意区分页框和页面的概念, 页框是针对内存的, 页面是针对进程的
e.g.
为了方便计算页号和页内偏移量, 页面大小一般设置为2的整数幂( why ? ) :
( 妙啊 )
tips : 页表中的页号是"隐含"的, 可以不占用存储空间
e.g.
假设某系统物理内存大小为 4GB, 页面大小为 4KB, 则
每个页表项至少应该为多少字节?
(但是, 为了方便页表的查询, 常常会让一个页表项占更多的字节, 使得每个页面恰好可以装得下整数个页表项)
框图 : ( 重点 ! )
步骤总结 :
根据逻辑地址计算出页号和页内偏移量
判断页号是否越界
查询页表, 找到页号对应的页表项, 确定页面存放的内存块号
用内存块号和页内偏移量得到物理地址 ( 页表长度*物理块号 + 页内偏移 = 物理地址 ( 计算机直接采用拼接物理块号和页内偏移的方式得到物理地址 ) )
访问目标单元
( 一共需要访问两次内存 : 第一次用来查页表, 第二次用于访问目标内存单元 )
时间局部性
如果执行了程序中的某条指令, 那么不久之后这条指令很有可能再次执行; 如果某个数据被访问过, 不久之后该数据很可能再次被访问
( 程序中存在大量的循环 )
空间局部性
一旦程序访问了某个存储单元, 在不久之后, 其附近的存储单元也很有可能被访问到
( 很多数据在内存中连续存放 )
快表又成为联想寄存器(TLB), 是一种访问速度比内存块很多的高速缓冲存储器, 用来存放当前访问的若干页表项, 以加速地址变换的过程. 与此对应的, 内存中的页表常称为慢表.
步骤总结 :
tips : TLB 和 普通 Cache 的区别——TLB 中只有页表项的副本, 而普通 Cache 中可能会有其他各种数据的副本
单级页表存在的问题 :
K 号页对应的页表项存放位置 = 页表始址 + K * 4
要在所有的页表项都连续存放的基础上才能用这种方法找到页表项
解决 : 把页表再分页并离散存储, 然后再建立一张页表记录页表各个部分的存放位置, 称为页目录表, 或称外层页表, 或称顶层页表.
e.g.
关于页表常驻内存的解决 -- ( 虚拟存储技术 ) , 在页表项中增加一个标志位, 用于表示该页面是否已经调入内存
注意:
如果采用多级页表机制, 各级页表不能超过一个页面
两级页表的访存次数分析 :
n级页表访存次数为n+1次: ( 以2级页表为例 )
ref : https://www.bilibili.com/video/BV1YE411D7nH?p=41
原文:https://www.cnblogs.com/roccoshi/p/13067579.html