操作系统学习笔记(四)內存分页管理方式

经过几个早上的奋战,终于把分页内存管理的那一句介绍给读明白了,赶紧总结下。

其实内存管理还有很多的知识点,比如为什么要进行内存管理,分页,分段,快表等等,之所以单挑出分页管理总结,是因为它是基础,也是我理解起来最难的。

基础概念理解

字,字节,位

计算机中,一个bit叫做一位,缩写为b,代表了一个0或者一个1,然后8个bit叫做一个字节(Byte),缩写为B,一个字又是两个字节组成

地址长度代表什么

我们经常说的32位操作系统,和64位操作系统,说的是地址的长度,也就是地址总线的根数,它决定了系统寻址的最大范围,比如32位系统,内存的寻址范围就是从0到2的32次方

什么叫以字节为单位编址

上面说的32位地址长度,可以表示0到2的32次方个地址,但是一个地址代表的内存空间可以是一位,也可以是一个字节,也就是说我们是否需要一位一位地读取内存数据,或者每次都读取字节整数倍的内存,如果是后者,那就是以字节位编址单位。

分页存储的几个概念

页面和页面大小

进程中的块称为页(Page),内存中的块称为页框(Page Frame,或者页帧)。外存也以同样的单位进行划分,直接称为块(Block)。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。

为了方便进行地址转换,页面大小应该是2的整数幂。同时页面大小应该适中,页面太小会使进程中的页面数过多,页表就会过长,占用大量内存,同时也会增加硬件地址转换的开销,降低页面换入/换出的效率;页面过大又会使页内碎片增多,降低内存的利用率。

地址结构

地址结构分为两部分,前一部分为页号P,后一部分为页内偏移量W,地址长度为32位,如果其中0-11位为页内地址,那么每页大小为4KB,也就是2的12次方个B(注意这里是以字节为单位编址才是4KB);12-32位为页号,地址空间最多允许2的20次方个页

页表

为了方便在内存中找到每个进程中每个页面对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般保存在内存中。

页表是由页表项组成的,初学者容易混淆页表项和地址结构,二者都是由两部分组成,且第一部分都是页号,但是页表项第二部分是该页号对应的物理地址块号,而地址结构第二部分是在该物理块中的偏移量。

页表项的第二部分拼接地址的第二部分才是真正的物理地址。

地址结构分为两部分,是真的各占一定长度,但是页表项内容就只有物理块号

基本地址变换机构

地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的。

在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。

进程未执行时,页表起始地址和页表长度存放在进程控制块中,当进程执行时,才将页表起始地址和长度存放进寄存器。

设页面大小为L,逻辑地址A到物理地址E的过程如下:

  • 计算页号P = A / L,和页内偏移量W = A % L
  • 比较页号P和页表长度M的关系,如果P >= M,则产生越界中断,否则继续执行
  • 页表中页号P对应的页表项地址 = F + P * 页表项长度,然后取出该页表项的内容b,即物理块号。(要注意区分页表长度和页表项长度,页表长度指的是一共有多少页,页表项长度指的是页地址占多大空间,也就是物理块号的地址长度)
  • E = b * L + W

页式管理只需要给出一个整数就可以确定对应物理地址,因为页面大小L是确定的,所以页式管理的地址空间是一维的。

如何确定页表项的大小

这一段就是最难理解的,理解了这一段,就基本能理解页式管理了。

页表项的作用时找到该页在内存中位置,以32位逻辑地址空间,字节编址单位,一页4KB为例,地址空间一共(2的32次方个B / 4KB)= 2的20次方个页 = 1M个页,就需要(以2为底1M的对数,也就是20)位才能容纳这么多页,也就是说物理块号的长度至少因该是20,这个20指的是地址长度,在计算机中实际上就需要20个b来存储,但是又因为我们是以字节为编址单位的,一个字节等于8个b,那我们的物理块号的长度应该大于等于 20 / 8的整数,也就是至少是3B(24个b,即物理块号长度为24)。

当然也可以选择更大的页表项让一个页面正好能容下整数个页表项,进而方便存储(如取成4B,一页大小是4KB,正好可以装下1K个页表项)。

还有一点需要注意,就是上面的讨论没有提及物理地址长度,默认就是逻辑地址长度和物理地址长度是相同的,但是实际上完全可能不相同.

比如逻辑地址32位,高20位为块号,低12位为偏移量,页表项长度,也就是物理块号长度可能是10,那么物理地址长度可能就是10 + 12 = 22.

两个题目

第一个

页式存储管理允许用户的编程空间为32个页面(每页1KB),主存为16KB,如果一个用户程序为10页长,且某个时刻页表如下:
逻辑页号 物理块号
0 8
1 7
2 4
3 10

则地址0AC5H,对应的物理地址是多少。

页面大小为1KB,所以逻辑地址低10位为页内偏移地址;
用户编址空间为32个页面,也就是高5位为页号;
主存为16个页面,即物理地址高4位为物理块号;

0AC5H 二进制为 000101011000101,页号为00010,即2,对应的物理块号为4,也就是0010(因为物理块号为4位),那么实际物理地址为01001011000101。

第二个

某主机主存按字节编址,逻辑地址和物理地址都是32位,页表项大小为4B

逻辑地址高20位为页号,低12位为页内偏移量

则页大小为多少字节?页表最大占用多少字节?

因为页内偏移量长度为12位,那么一页大小就为2的12次方B,也就是4KB。

页号长度为20,那么可以表示2的20次方个页,页表长度最大为2的20次方,一个页表项大小为4B,那就是说页表最大为2的20次方 * 4B。

物理地址长度理论上应该是是物理块号长度+页内偏移量长度 = 页表项大小 + 偏移量长度 = 4B + 12b = 32b + 12b = 44b,也就是44位,但又说实际物理地址是32位,那就是说高44 - 32位全是0,是无效的。