3.1_10 段页式管理方式
(一)分页、分段的优缺点分析
基于分页、分段的优缺点,人们想出了将分页、分段结合,就产生了段页式管理。段页式管理具备了分页、分段各自的优点。
(二)分段+分页=段页式管理
将进程按逻辑模块分段,再将各段分页(如每个页面4KB)。
再将内存空间分为大小相同的内存块/页框/页帧/物理块。
(三)段页式管理的逻辑地址结构
分段系统的逻辑地址结构由段号和段内地址(段内偏移量)组成。如:
对于段页式管理,我们知道,一个进程在被分段之后,还会被再次分页。
段页式系统的逻辑地址结构由段号、页号、页内地址(页内偏移量)组成。如:
此处的“页号+页内偏移量”其实就是分段管理当中的“段内地址”。是对“段内地址”进行再拆分的一次结果。
段号的位数决定了每个进程最多可以分几个段。
页号位数决定了每个段最大有多少页。
页内偏移量决定了页面大小、内存块大小是多少。
在上述例子中,若系统是按字节寻址的,则
段号占16位,因此在该系统中,每个进程最多有 2 16 = 64 K 2^{16}=64K 216=64K个段。
页号占4位,因此每个段最多有 2 4 = 16 2^4=16 24=16页。
页内偏移量占12位,因此每个页面大小(也即每个内存块大小)为 2 12 = 4096 = 4 K B 2^{12}=4096=4KB 212=4096=4KB。
在段页式存储当中,“分段”对用户是可见的,程序员编程时需要显式地给出段号、段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。——即,对于用户来说,他只需向系统提供:段号、段内地址。
因此段页式管理的地址结构是二维的。
与之相应的,段式管理的地址结构也是二维的;页式管理的地址结构是一维的。
提示:在分页存储管理(页式管理)的系统中,只要确定了每个页面的大小,逻辑地址结构就确定了。因此,页式管理中地址是一维的。即,只要给出一个逻辑地址,系统就可以自动地算出页号、页内偏移量两个部分,并不需要显式地告诉系统这个逻辑地址中,页内偏移量占多少位。
(四)段表、页表
进程当中的各个段会分别对应段表当中的一个段表项。
由于内存块号的大小是固定的,因此,通过查询段表项,找到页表存放的块号,就能找到页表存放的地址。
如上图,我们要查找
0号段
的段表项,可知0号段的页表
存放在内存中的1号块
的位置。从而就可以从内存当中读出0号段对应的页表
信息。此外,由于
0号段
大小是7KB,而每个页面的大小是4KB,所以它会被分成两个页面。相应地,这两个页面就会依次对应0号段的页表
当中的两个页表项。每一个页表项记录了每一个页面对应的内存块号是多少。
每个段表项由段号、页表长度、页表存放块号(页表起始地址)组成。每个段表项长度相等,段号是隐含的。
每个页面对应一个页表项,每个页表项由页号、页面存放的内存块号组成。每个页表项长度相等,页号是隐含的。
在段页式管理中,段表的结构,与段式管理中的段表是不一样的。段式管理当中的段表记录的是
(段号, 段的长度, 段的起始地址)
;而段页式管理当中的段表记录的是(段号, 页表长度, 页表存放块号)
。而对于页表而言,段页式管理、分页管理的页表结构基本上一样,都是记录页号到物理块号的映射关系。此外,无论是段表还是页表,由于每个段表项/页表项的大小是相等的,因此无论是段号、页号,都是隐含的。
一个进程会对应一个段表,但是一个进程有可能会对应多个页表。
(五)地址转换
首先,系统当中也会有一个“段表寄存器”的硬件。在进程上处理机运行之前,会从PCB当中读出段表始址F和段表长度M。
第一步,根据逻辑地址得到段号、页号、页内偏移量。
第二步,要把段号和段表长度进行对比,检查是否越界。
第三步,根据段表始址、段号,从而计算出这个段号对应的段表项在内存当中的存放位置。就找到了我们想要找的段表项。
第四步,需要注意的是,由于各个段的长度是不一样的,所以各个段在分页之后,可能分为数量不等的不同页面。(比如有的段长一些,就会分为2个页面;有的段短一点,只需1个页面)因此,这个地方我们也需要对页号的合法性进行检查,看看页号是否越界。——总之,通过段表项,我们读出了这个段对应的页表,存放在内存块的哪个位置,从而读出该页表。
第五步,已知这个段对应的页表信息,以及页号是多少,就可以找到相应的页表项,从而找到这个页面对应的内存块号,再结合页内偏移量,即可得知最终的物理地址。
因此,在段页式存储管理当中,进行逻辑地址的转换,总共需要三次访存。
第一次访存——访问内存当中的段表;
第二次访存——访问内存当中的页表;
第三次访存——访问最终的目标内存单元。
之前也介绍过,在分页、分段管理方式中,也都是可以引入快表机构的。
同样地,在段页式管理方式中,也可以引入快表机构,用段号和页号作为查询快表的关键字。若快表命中,则仅需一次访存。