页式管理
在基于分页的虚拟内存方案中,通常每个进程都有一个唯一的页表,对应于每个进程都有自己的虚拟地址空间。
页表项的格式为:
- P位:由于一个进程可能只有一些页在内存中,因此每个页表项需要有一位(P)来表示它所对应的页当前是否在内存中。如果这一位表示该页在内存中,则这个页表项还包括该页的页框号。
- M位:修改位(脏位),表示相应页的内容从上一次装入内存中到现在是否已经改变。若未改变,则当需要把该页换出时,不需要用页框中的内容更新该页,即不需要将该页的内容再写回磁盘,可以直接丢弃。
由于页表的长度可以基于进程的长度而变化,因此不能在寄存器中保存,页表必须在内存中且可以访问到。
当一个进程正在运行时,一个寄存器保存该进程页表的起始地址,虚拟地址(又称为逻辑地址,由页号和偏移量组成)的页号用于检索页表(可以看作是页表的索引,即页表项相对于页表起始地址的位置),查找内存中相应的页框号,并将查找到的页框号与虚拟地址中的偏移量组合起来产生对应的物理地址(由页框号和偏移量组成,是内存中的实际地址)。
当页表过大,占据过多内存时,可以采用多级页表的形式,主要有二级页表(即创建页表的页表,可以理解为将原来的页表分为多个大小相等的块/页表)。(参考文章,强烈推荐)
以虚拟地址空间为32位(4GB)为例,若页面大小为4KB(即2^12),则页表一共有1M个页表项(4GB/4KB=1M),一个页表项包含了一个页框号,指向内存中的具体页框。若每条页表项占用4B,则一个页表需要占用4MB的内存。如果使用二级页表,则将原来的页表再分为大小相同的页,再建立对应的索引。所以如果二级页表退化为一级页表&