把一个逻辑地址连续的程序分散存放到几个不连续的内存区域中,并且保证程序的正确执行,即可充分利用内存空间,又可减少移动所花费的开销。
基本思想
该技术已广泛用于微机系统中,支持页式存储管理的硬件部件通常称为“存储管理部件”。
存储管理部件首先把内存分为大小相等的许多区把每个区称为“块”,块是进行主存空间分配的物理单位。要求程序中的逻辑地址也进行分页,页的大小与块的大小一致。
假定地址用m个二进制表示,其中页内地址部分占用n个二进制位,那么,每一块的长度就是2的n次方,也就是每一页有2的n次方个字节。页号部分占用了m-n位,所以,最大的程序可允许有2的(m-n)次方个页面。逻辑地址从“0”,页内地址也为“0”,当编制到2的n次方-1时,第0页的页内地址的各位均为“1”,即占满了一个页面。下一个地址是2的n次方,这时页号部分就为“1”,而页内地址部分又恢复到了“0”,表示进入了第1页。再继续顺序编址,此时页内地址0~(2のn次方-1)是属于第1页。一组顺序的逻辑地址结构将其自然地分页。
存储空间的分配与回收
- 那些块已经分配。
- 那些块尚未进行分配。
- 当前剩余的空闲块数。
假设内存的可分配区域被分为256块,则可用字长为32位的8个字作为“位示图”,位于图中的每一位与一个内存块对应,每一一个的值可以是0或1,0表示对应的内存块为空闲,1表示已经占用。
找出一些为0位,把这些位置成1,并从空闲块数中减去本次分配的块数,然后按照找的的位计算出相对应的块号。
块号 = 字号 X 字长 +位号
根据归还的块号计算出该块在位示图中对应的位置,将占用标志修改成0,再把回收的块数相加到空闲块数中。
地址转换与块表
为每一个被装入内存的进程提供一张页表,该页表所在内存的起始地址和长度作为现场信息存放在该进程的PCB中。
页式存储管理的地址转换
当进程被调度程序选中投入运行时,系统将其页表手地址从进程控制块中取出送入该寄存器,页表长度寄存器用于保存正在运行进程的页表的长度。
页表指出该程序逻辑地址中的页号与所占用的内存块号之间的对立关系。页表长度由程序拥有的页面数而定,故每个程序的页表长度可能是不同的。
若页表中有次页号,则可得到对应的内存块号,
物理地址 = 内存块号 x 块长 + 页内地址
页表
多级页表
假设用户地址空间为2GB,页面大小为4KB,则一个进程最多有2的19次方页。
存放页表的页面为页表页。
在大多数操作系统中采用二级页表,有页表页和页目录一起构成进程页表。
第一级表示页目录,保存页表页的地址,第二级表示页表页,保存物理页面号(即内存块号)。
散列页表
当地址空间大于32位时,一种常见的方法是使用以页号为散列值的散列页表。
- 虚拟页号
- 所映射的页框号。
- 指向链表中下一个元素的指针。
反置页表
每个进程都有与之相关的页表。
每个物理页框对应一个表现,每个表项包含与该页框相对应的虚拟页面地址以及拥有该页面进程的信息。
块表
页面存储管理中的页表是存放在内存中的。当要按给定的逻辑地址进行读写时,必须访问内存两次。
- 第一次按页号读出页表中对应的块号。
- 第二次按计算出来的绝对地址进行读写。
两次访问内存显然延长了指令的执行周期,降低了执行速度。
- 在地址映射机制中增加一组高速寄存器保存页表,这需要大量的硬件开销,在经济上不可行。
- 在地址映射机制中增加一个小容量的联想寄存器(相联寄存器),他又Cache组成。
利用高速缓冲存储器存放当前访问次数最少活动页面的页号,这个高速缓冲器被称为“快表”,也称为转换检测缓冲器。TLB
快表中登记了页表中的一部分页号与内存块号的对应关系。
快表只存放当前进程中最活跃的少数几页,随着进程的推进,快表的内容动态更新。
更新原理:查找快表和查找内存页表,而直接利用快表中的逻辑页号。