先来看看网上的一道例题(其实网上有解析,但我第一遍没反应过来……所以把现在的理解写下来,以防之后又迷了)

题目一:有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、A、5块,试将虚地址0AFEH转换成内存地址。

先来明确一下地址结构的分布

页式地址重定位模拟java 页式地址变换算法_操作系统

前一部分为页号 P,后一部分为位移量 W(或称为页内地址)。

也就是说页号占虚地址的高位部分,页内地址占虚地址的低位部分

题目有两种出题的方式,一种是给你的虚地址不是十进制,可能是十六进制,八进制等,就比如上面的这题

题目给出的虚拟地址是十六进制,为什么是十六进制呢,看0AFEH,最后一个字母是H

页式地址重定位模拟java 页式地址变换算法_页式地址重定位模拟java_02

所以我们要先转换为2进制

页式地址重定位模拟java 页式地址变换算法_页式地址重定位模拟java_03

由此我们可以得到题目中的二进制为
0000 1010 1111 1110

然后我们看向页的大小,题目中页的大小为2kb,即2048也就是2的11次方。同理如果页的大小是1kb,也就是1024即为2的10次方

按照本题的2的11次方来从右往左数11位
0000 1010 1111 1110会被分为
010 1111 1110 与 0000 1

前面说过页号P占虚地址的高位部分,页内地址W占虚地址的低位部分
所以这里W=010 1111 1110, P=0000 1=1

根据题目中的前提——依次装入内存的第7、9、A、5块

页式地址重定位模拟java 页式地址变换算法_内存地址_04

页号P=1,查表可得块号为9,而9的二进制是1001,表首地址为0
将1001放在页内地址W=010 1111 1110的前面
0100 1010 1111 1110(前面位数不够可以补零)
将上面这行二进制转换为16进制即为4AFEH(最后一个H代表是十六进制)

总结一下就是

第一步,将虚地址转换成二进制的数;
第二步,按页的大小分离出页号和位移量(低位部分是位移量,高位部分是页号);
第三步,根据题意产生页表,将位移量直接复制到内存地址寄存器的低位部分;
第四步,以页号查页表,得到对应页装入内存的块号,并将块号转换成二进制数填入地址寄存器的高位部分,从而形成内存地址。

题目还有可能直接给你十进制的数字,这时候可以套公式得出结果

若给定一个逻辑地址空间中的地址为 A,页 面的大小为 L,则页号 P 和页内地址 d 可以由下面的式子得出

页式地址重定位模拟java 页式地址变换算法_内存地址_05


INT是整除函数,MOD 是取余函数

通俗的讲就是

页 号(整除)=虚地址 / 页大小
位移量(取模)=虚地址 mod 页大小
根据题意产生页表;
以页号查页表,得到对应页装入内存的块号
内存地址=块号×页大小+位移量

再来看例题
题目二:有一系统采用页式存储管理,有一作业大小是8KB,页大小为2KB,依次装入内存的第7、9、10、5块,试将虚地址7145转换成内存地址。

根据公式

P=7145/2048=3(只取整数)

W=7145 mod 2048=1001(取余数)
按照页表查询
页号 块号
0 …… 7
1 …… 9
2 …… 10
3 …… 5

页号P为3,查询到块号为5,又因为页大小为2kb即2048
所以最终结果是5*2048+1001=11241