操作系统原理-清华大学
通过段号找到所在物理内存的起始地址,段表里存的是逻辑地址的段号和物理地址的段号之间的映射关系。 段表由操作系统来建立
段表的信息:段的起始地址,长度的限制
段的起始地址+偏移量 来查找在物理地址的位置把相应的数据取出来交给cpu做处理
分页机制
一个程序在运行的时候,这个程序本身的地址(逻辑地址)是连续的空间,将页号作为一个索引查页表,页表存的是以页号为索引的对应的帧号 加上偏移(和页的偏移一致)得到物理地址
页表由操作系统建立 分页机制页偏移大小是固定的
逻辑地址空间为连续的,映射到物理地址空间不一定连续,这样可以减少内存碎片
页表概述
标志位:存在属性(有可能有一部分逻辑地址空间没有映射到物理地址空间) ,读过,写过
分页性能机制的问题
缓存
把经常访问的页表项放到TLB中,此时就不需要查页表,当CPU得到一个逻辑地址,首先根据p查TLB,如果TLB存在p,很容易找到f,
当TLB表项不存在,就要去页表中查
通过某种机制可以使得TLB确实尽量少(编程的时候需要注意的) X86而言有硬件完成
页的offset和页帧的offset大小是一样的
二级页表
寻址的时候首先找一级页表,把p1的number作为index,查找一级页表的页表项(存的是二级页表的起始地址),根据p2作为二级页表的Index,查找二级页表的页表项,找到帧号
这里体现了二级页表的另一个好处,就是p1对应的位置是flags,假如说resident bit是0,那么整个二级页表都不用在内存中保存,这个是一级页表无法实现的!
多级页表 目的:节省空间,虽然访问页表的开销会很大,但是节省了空间,以时间换空间了
例如64位系统采用5级页表。
反向页表
尽量使页表大小与逻辑空间大小没有那么大关系,和物理空间有对应关系
大空间地址问题
反向页表的实现
基于页寄存器page registers的方案
使用页寄存器
index不再是页号,而是页帧号(物理地址),页表下的内容为页号
residence bit:此帧是否被占用;
occupier:对应的页号p;
protection bit:保护位;
比如
物理内存大小:4096 * 4096 KB = 16 MB
页面大小:4064 bytes = 4 KB
页帧数: 4K
页寄存器使用的空间(假设是8 bytes的register):8 * 4096 = 32 KB
页寄存器的额外开销:32 KB / 16 MB = 0.2%
虚拟内存的大小:任意
可以看出内存开销很小。
实现:基于关联内存associative memory的方案
存在的问题
如果帧数较少,页寄存器可以被放置在关联内存中;
在关联内存中查找逻辑页号,成功了,帧号就被提取出来;失败了,页错误异常page fault。
限制这种方案的因素包括,大量的关联内存非常昂贵(难以在单个时钟周期内完成;耗电)。
实现:基于哈希表的方案
述方法可能导致一个key出现2个以上的value对应。
这种方式仍然需要把反向页表放在内存中,做hash计算的时候还需要在内存中取数,仍然需要多次访问内存。