连续分配的三种管理方式有一个共同的特点就是,用户程序在内存当中都是连续存放的,在连续存放的方式当中,即使内存由超过1GB的内存,可是却未必有超过1GB的连续内存,需要1GB内存的作业仍然是无法运行的,所以就引入了分连续分配的内存管理方式,他的存储密度是低于连续分配的管理方式的。
非连续分配方式有根据分区的大小是否固定,分为页式存储管理和段式存储管理,而在页式存储管理当中又将作业运行是否需要将全部的页面都调入内存分为基本分页式存储管理和请求分页式存储管理。
固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都很低,我们希望在内存的使用过程当中尽可能地避免产生碎片,这也就引入了分页的思想;我们将主存划分为大小相同切固定的块,块相对较小,作为主存的基本单位,每个进程也已块为基本单位进行划分,进程在执行的时候,以块为单位逐个申请内存的块空间。
分页的方式从形式上看,像分区相等的固定分区技术,分页管理不会产生外部碎片,但是分页管理相比于固定分区又有着本质的特点,块的大小相对于分区要小很多,而且进程也会按照块进行划分,进程在执行的时候按照块为单位申请内存空间并且执行,这样子的话进程只会在为最后一个不完整的块申请内存空间的时候产生内存碎片,所以尽管产生碎片,但是这种碎片对于进程来说是很小的,每个进程平均只产生半个快大小的内部碎片,也叫页内碎片。
进程中的块称为页或者页面,内存中的块成为页帧或者页框,外存中也已同样的单位进行划分,直接成为块或者盘块,进程在执行的时候需要申请内存空间,也就是需要为进程中的每个页面申请可用的页框或者页帧,这也就产生了页面和页框的一一对应。
为了方便地址的转换,页面的大小应该是2的整数幂,同时页面的大小也应该适中,页面太小的话会使得进程中的页面数过多,这样子页表就会很长,占用了大量的内存,而且也会增加硬件地址转换的开销,降低页面换入/换出的效率;页面过大又会使页内碎片增多,降低内存的利用率。
分页存储管理的逻辑地址结构如图所示:
页号P | 页内偏移量W |
地址结构包含两部分,前一部分为页号P,后一部分为页内偏移量W。地址长度为32位。其中0~11位为页内地址,即每页大小为4KB,12~31位为页号,即最多允许2^20页存在。
注意地址结构决定了虚拟内存的寻址空间有多大,在实际问题中页号、页内偏移量、逻辑地址可能是用十进制数给出的,若题目用二进制地址的形式给出时,读者要学会转换。
为了便于在内存当中找到进程的每个页面所对应的物理块(页框),系统会为每个进程建立一张页表,它记录页面在内存中对应的页框,页表一般存放在内存当中。
配置页表后,进程执行的时候通过查找该表,即可找到每页在内存中的物理块号,可见页表就是实现从页号到物理块号的地址映射,说白了就是基本分页存储管理当中虚拟地址向物理地址的转换。
页表是由页表项组成的,很多人容易混淆页表项和地址结构的概念,页表项与地址结构都由两部分组成,而且第一部分都是页号,但是页表项的第二项是由物理块号组成的,也就是进程对应内存当中的物理块号(页框号),但是地址结构的第二部分确是由页内偏移量构成的。页表项的第二部分物理块号与地址结构的第二部分页内偏移量共同构成物理地址。
说到这里可能还是有很多的小伙伴不明白,首先要明白一个重要的概念页内偏移量也叫做页内地址,二者是等同的,只不过说法不一样而已,还要知道一个重要的概念就是,逻辑地址结构经过页表的检索以后,逻辑地址取下第二部分页内偏移量(页内地址)与页表的第二项结合经过一定的计算才能生成物理地址,这是为什么呢?
其实很简单,要知道物理块号知识一个笼统的地址范围,一个物理块号内部是可以存放很多的东西的,就比说我们的大学宿舍,一个大学宿舍里面是住着很多的人的,那么物理块号就相当于宿舍号,根据物理块号只能找到你的宿舍,但是你宿舍的床位在哪里呢?是不是在宿舍内部还要有一个地址,比如你是二号床,那么这个“二号床”就是页内地址也叫页内偏移量,物理块号仅仅代表你们宿舍的入口地址,但是从宿舍的大门入口到你自己的床位是有一个偏移量在里面的,所以给位小伙伴们你们现在可以理解页表的作用了吗?
地址变换机构的任务是将逻辑地址转换为内存中的物理地址,而地址变换是借助于页表实现的,在系统中设置一个页表寄存器,存放页表在内存中的起始地址F和页表长度M。
平时进程在未执行的时候,页表的起始地址和页表长度存放在本进程的PCB中,当进程调度的时候才将页表的起始地址和页表长度装入页表寄存器当中。我们在这里将页面大小身为L,逻辑地址A到物理地址E的变换过程如下:
分页式存储管理面临着两个主要的问题,首先每次方寸操作都需要进行逻辑地址向物理地址的转换,地址转换的过程必须快,否则访存速度就会变低。其次每个进程都要引入页表,用于存储映射机制,页表不能太大,否则内存利用率就会降低。
在上面介绍的地址变换过程可知,若页表全部放在内存当中,则存取一个数据或者一条指令至少要访问两次内存,第一次是访问页表,确定所取的数据或者指令的物理地址,那么第二次就是根据该地址将数据或者指令取出来。显然这种方法比平时普通的取指令要慢了一半。
为此在地址变换机构当中设置一个具有并行查找能力的高速缓冲存储器——快表,又称相联存储器(TLB),用来存放当前访问的若干个页表项,以加速地址变换的过程,与此对应,主存中的页表常称为慢表,具有快表的地址变换机构如图所示。
在具有快表的分页机制当中,地址的变换过程如下:
昨天为大家讲解了内存的连续分配管理方式,今天为大家详细地讲解了内存非连续分配管理方式中的基本分页存储管理,这种分配管理方式不需要在内存当中找到连续的内存空间也能够运行进程,明天将为大家讲解基本分段式存储管理,这个和基本分页式存储管理方式有很多类似的地方,希望我的每一篇文章都能让每一位读者都有所收获。