一、默认设定
(一)按字节编制==一个房间可以装8只猪猪
现在的计算机一般都是按字节编址的。这个不理解的话,可以看我的文章为什么20位地址总线决定寻址空间是1MB“http://t.csdn.cn/Eo2nE”
(二)内存采用非连续分配方式
即,下面的例子中,如果CPU运行进程A时需要把二页数据调入内存,这两页可以不连续(两栋别墅可以不连号)
(三)官话、规定
为了方便举例子,现在我规定一下我的例子中,1页是8B,内存可以有16页,外存有64页,某个进程需要2页。
↓以下这个是结合书本的规定与例子来讲解
1.内存外存都按照一页一页来划分。
外存:64页/64块
对一页的理解如下(猪就是数据,更准确地说,就是数字0或数字1)
1.内存里面的页,叫页框,即图示中的一栋别墅;
2.外存中的页,叫做块。
二、实例理解基本分页存储管理的地址转换过程
现在来考虑基本分页存储管理的地址转换过程:(模拟寻址过程,实际上CPU应该是一页一页数据调入的,即一栋一栋的别墅调度进来,而不是把一栋别墅的一层调进来)
某一天,CPU如果要运行进程A,根据进程A的要求,需要把外存中15号别墅(因为从0开始编号,15号别墅是第16栋,图中显示的是编号,不是第几栋)的7号房间和16号别墅的0号房间请到内存里面的1号别墅的6号房和3号别墅的5号房。
假设内存里面有两种表达的方式,第一种是别墅栋号和栋内相对编号,第二种是直接用房号编址的对应关系如下:(假设1页1B!!)
两种表达方式对应如下↓
即,用房间编号的话:
内存里面的1号别墅的6号房 == 14号房
内存里面的3号别墅的5号房 == 29号房
CPU与进程的沟通方式如下(不严谨模拟版)
进程记录这个对应关系,
首先,要记录其中的别墅栋号,
因为外存有64栋,内存有16栋,因此外存需要记录数字0-63(对应二进制的0至111111);内存需要记录数字0-15(对应二进制的0至1111)
外存材料比较便宜,因此外存一般都比内存大,所以,需要记录的数字的最大范围一般以外存的数字范围为准,即我们需要记录栋号0至11111,为了记录这个栋号,需要5bit位来存放数字。即在这个例子中,栋号需要5bit位来记录
其次要记录“栋内偏移量”,即别墅内的相对的房间号
因为我们最开始假设了一页是8B,即一栋别墅有8层,(每层一个长条形房间),即一栋别墅有8个房间,这些房间的编号从0到7,(对应二进制0至111),为了记录别墅内的相对的房间号,需要3bit位来记录。即在这个例子中,别墅内相对房间号需要3bit位来记录
把上面的例子转换成页式存储管理,就是
拿到一个逻辑地址/对话中的“内存的29号房”/
把逻辑地址/对话中的“内存的29号房”/除以页面大小/一栋别墅8个房间/,得到页号+页内偏移量(分别对应别墅栋号和栋内偏移量)
逻辑地址
页面大小
=
按房号编址的房间号
一栋别墅容纳的房间个数
=
29
8
=
3...5
\frac{逻辑地址}{页面大小}=\frac{按房号编址的房间号}{一栋别墅容纳的房间个数}=\frac{29}{8}=3...5
页面大小逻辑地址=一栋别墅容纳的房间个数按房号编址的房间号=829=3...5
即第4栋别墅的第5个房间,按从0开始编号的话,就是3号别墅的6号房间。
这里的别墅栋号,就是页式存储管理里面所谓的页号。
这里的栋内相对房间号,就是页式存储管理里面的页内偏移量。
这个例子中的页表:
进程设计的表想要把这些信息存起来,为了存别墅栋号(0至11111)和栋内房间号(0至111),需要5bit位存栋号,需要3bit位存“栋内偏移量”。
即用来存信息的表中,栋号占5bit位,栋内偏移量占3bit位。
例如:29号房间=3号别墅的6号房
换成二进制的栋号、栋内偏移量即00010,101;
因此29号房间对应的页表项就是00010101。(这里先不考虑什么访问位那些鬼的)
所以表里面存的信息就是00010101,其中前5bit是栋号,即所谓的页号,后3bit位是栋内偏移量,即页内偏移量。
而设计的用来存信息的表,叫做页表。
而页表里面的每一条对应关系,就是页表项。
00010101,5bit页号+3bit页内偏移量,就是这个例子下的“地址结构”
CPU再来调用进程时,获取到00010101时,把逻辑地址3号别墅的6号房转换成物理地址29号房间,就是所谓的逻辑地址转物理地址。