分页
基本原理
虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,再也不能直接访问物理内存。但程序最终肯定是运行在物理内存中的,解决方法就是分段和分页两种技术。
分页机制就是把内存地址空间分为若干个很小的固定大小的页,每一页的大小由内存决定
为实现分页存储管理,需要哪些硬件的支持?
- 动态重定位技术
- 虚拟存储技术
- 多道程序设计技术
页面置换算法
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
最佳置换OPT:(理想置换算法)替换最长时间不需要访问的页面 先进先出FIFO:按照队列的顺序 最近最久未使用LRU:替换在最近一段时间内最久不用的页面 时钟Clock:类似轮询,初始标记位0 加入或者使用时标记为1,替换标记为0的,当全部为1时,遍历并全更换为0
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
快表:存放在高速存储器中的页表部分
- 为提供地址转换速度,设置一个专用的高速存储器,用来存放页表的一部分
- 快表表项:页号,页架号
- 这种高速存储器是联想存储器,即
按照内容寻址,而非按照地址访问·
基于快表的地址转换流程
-
按逻辑地址中的页号查快表
-
若该页已在快表中,则由页架号和单元号形成绝对地址
-
若该页不在快表中,则再查主存页表形成绝对地址,同时将该页登记到快表中
-
当快表填满后,又要登记新页时,则需在快表中按一定策略淘汰一个旧登记项
颠簸(抖动)
在页面置换时,如果换出的页面是一个很快会再次访问的页面,则缺页后会继续缺页,导致整个系统的效率急剧降低。
解决方法:1.改进替换策略 2.增大物理内存
分段
虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。
分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
段页式
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
分页与分段的区别
-
对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。
-
地址空间的维度:分页是一维地址空间,分段是二维的。
-
大小是否可以改变:页的大小不可变,段的大小可以动态改变。
-
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段有助于共享和保护。
缺页中断与一般中断的区别
- 一条指令在执行期间,可能产生多次缺页中断
- 缺页中断返回的是中断的那一条指令;而一般中断返回的是下一条指令
什么是大端小端,以及如何判断他们?
大端是指低字节存储在高地址;小端是指低字节存储在低地址。
可以通过联合体union来判断,因为union变量总是从低地址存储
int main()
{
union test
{
int i;
char c;
};
test t;
t.i = 1;
//如果是大端,则t.c=0x00,t.c!=1,返回0 ; 如果是小端,则t.c==0x01,则t.c==1,返回1
return (t.c == 1);
}
x86架构下,页面大小为什么是4K? x64架构呢?
页面大了,浪费的内存也多了,4K是一个综合评价后的结果.