操作系统-内存管理-基本分页内存管理方式

来源:互联网 发布:hdc电视直播软件 编辑:程序博客网 时间:2024/05/16 19:33

操作系统-内存管理-基本分页内存管理方式


1.离散分配方式的引入及其分类

  • 连续分配方式会形成大量的碎片(零头),虽然可以通过拼接(紧凑)的方式将碎片(零头)拼接成大的分区(一段连续的内存空间),但是拼接(紧凑)技术需要将程序和数据在内存中进行移动,这会对CPU造成很大的开销。
  • 如果将进程分散的装入到不相邻接的内存空间中,则不需要拼接(紧凑),这样不仅提高了内存利用率,而且也能减小CPU开销。
  • 基于上述思想产生了离散分配方式,即将一个将进程分散的装入到不相邻接的内存空间中。按照离散分配单位的不同,可将离散分配分为:
    (1)分页内存管理方式:离散分配的基本单位是页。
    (2)分段内存管理方式:离散分配的基本单位是段。
  • 在分页内存管理方式中,按照页面具不具备页面对换(swapping)功能(其实只有支持页面对换功能才能支持虚拟存储系统),可将分页内存管理方式分为:
    (1)基本的分页内存管理方式(纯分页内存管理方式):不具备页面对换功能,不支持虚拟存储系统。
    (2) 请求分页内存管理方式:具备页面对换功能,支持虚拟存储系统。
  • 在分段内存管理方式中,按照分段具不具备分段对换(swapping)功能(其实只有支持分段对换功能才能支持虚拟存储系统),可将分段内存管理方式分为:
    (1)基本的分段内存管理方式(纯分段内存管理方式):不具备分段对换功能,不支持虚拟存储系统。
    (2) 请求分段内存管理方式:具备分段对换功能,支持虚拟存储系统。

2.基本的分页内存管理方式(纯分页内存管理方式)

2.1概念

在分页内存管理方式中,有几个概念要重点区分:

2.1.1.逻辑地址与物理地址

(1)逻辑地址:逻辑地址空间中的地址,这个每个进程都对应着一个逻辑地址空间,进程中程序指令和数据的物理地址一般从0开始。
(2)物理地址:在实际的内存空间中的地址,进程中程序指令和数据的物理地址一般不是从0开始。

2.1.2.页面与物理块(页框)

(1)页面:页面对应着逻辑地址空间中的一片,逻辑地址空间就是由很多大小相等的片构成。
(2)物理块(页框):物理块(页框)对应着实际内存空间中的一块,内存空间就是由很多大小相等的物理块(页框)构成。

2.1.3.页内碎片与零头(碎片)

(1)页内碎片:进程的最后一页一般装不满,剩下不可利用那部分页内空间就叫做页内碎片。
(2)零头(碎片):在动态分区分配中,分区的大小一般不会和作业大小相同,导致分区还剩下一些难以再利用的分区空间(利用拼接技术可以再利用),这个分区空间就叫做零头(碎片)。

2.1.4.页面大小与物理块(页框)大小

页面大小必须与物理块(页框)大小相同。并且页面大小应该适中,理由如下:
(1)页面大小过小。优点:页面碎片减小,内存空间利用率提高。缺点:每个进程占用的页面增多,进程页表过长,占用内存;降低页面换进换出的效率。
(2)页面大小过大。优点:减少了进程占用的页面数,减少页面占用的内存;提高了页面换进换出的速度。缺点:页内碎片增大。(但是针对特定应用使用大页会对系统性能有质的飞跃)
页面大小一般是2的幂,通常为512B~8K。

2.2.页表

  • 为了能在内存中找到每一个页面对应的物理块(页框),OS需要实现页号到物理块号(页框号)的转换,OS为每一个进程建立了一张页表(页面映像表)来完成这项工作。
  • 需要注意的是,页表也是存储在内存空间中,所以有可能一个页面(实际上时物理块)装不下一张页表,这时也需要用多个页面来存储页表。
  • 页表的页表项存储着物理块号(页框号)和存取控制字段,需要注意的是页表的页表项中并没有存储物理块号(页框号)对应着的页号,因为页表中页表项的索引就可以表示为页号。
  • 页表的页表项中存这的存取控制字段其实就是1位(该物理块对应的内容只允许读还是读写均可)或2位(该物理块对应的内容:读/写、只读、只执行)。

2.2.地址变换

  • 地址变换机构的任务是实现逻辑地址到物理地址的转换,但是因为页内地址和物理块(页框)内的地址是意义对应的,不需要转换,所以只需要将页号转换为物理块号(页框号)就行。
  • 既然要进行地址转换,就必须根据页号在页表中检索(注意检索和搜索的区别)相应的物理块号(页框号)。检索相当于根据数组索引定位数组元素,而搜索相当于遍历数组找到匹配项。
  • 按照地址变换机构存放的存储介质的不同,可以将地址变换机构分为基本地址变换机构和TLB(Translation Lookaside Buffer,地址变换高速缓存、快表、联想寄存器)。
  • 在介绍这两种地址变换机构之前先了解一下逻辑地址的地址结构。

2.2.1.逻辑地址的地址结构

  • 在分页内存管理方式中,逻辑地址的地址结构:页号P+页内地址(位移量)W
  • 页面大小决定页内地址位数,比如说:页面大小为4KB,则页内地址的位数为12位,因为2^12B=4KB。
  • 页号的位数=总地址长度-页内地址位数,页号的位数决定着页面的个数。

2.2.2.基本地址变换机构

  • 页表存放于内存中。
  • 页表不存放于寄存器中的原因:从理论上说,要想提高地址变换的速度,可以将页表存放于一组寄存器中。但是由于页表项的总个数可能会高达几千甚至几十万,而寄存器又十分昂贵,所以一般不将页表存放于寄存器中。
  • 系统中会有一个页表寄存器(PTR,Page-Table Register),这个寄存器存放着页表始址和页表长度。
  • 在进程未执行时(就绪、阻塞),页表始址和页表长度存放在本进程的PCB(进程控制块)中,当进程被调度执行时,才会将页表始址和页表长度装入页表寄存器。在单核CPU中,CPU可以并发运行多个进程,但只需要一个页表寄存器。
  • 地址转换过程:
(1)地址变换机构自动将逻辑地址分为页号和页内地址。(2)将页号也页表长度进行比较,若页号(从0开始)大于等于页表长度,则触发越界中断。(3)以页号为索引检索页表获取页表项。页表项的位置 = 页表始址+(页号*页表项长度)。(4)从获取的页表项中得到物理块号。并将该物理块号装入物理地址寄存器的物理块号中(页框号)字段中。(5)将逻辑地址寄存器中的页内地址装入物理地址寄存器中的物理块内地址(页框内地址)字段中。(6)进过(4)(5)步,物理地址寄存器中就存放了物理地址。物理地址=物理块号*2^页内地址位数+物理块内地址(页框内地址,实际上就是页内地址)

  备注:要注意页表长度与页表项长度的区别:
  (1)页表长度代表页表中页表项的总个数。
  (2)页表项长度代表每个页表项占用的内存空间(以Byte为单位)
  (3)第(4)步到第(6)步可以简写为:根据页表项获取物理块号(页框号),然后物理块号(页框号)与页内地址拼接成物理地址。

2.2.3.TLB(Translation Lookaside Buffer,地址变换高速缓存、快表、联想寄存器)

  • 由于页表存放于内存中,这使得CPU在内存每取一个数据时,都要进行两次访问内存的操作。第一次访问内存时为了读取页表中的物理块号,然后与页内地址拼接成物理地址。第二次访问内存才是真正读取(写入)所需的数据。这种方式使得CPU的处理速度降低了将近1/2,是用CPU处理时间换取内存空间利用率。
  • 为了提高地址变换速度,可以在CPU中增设一个具有并行(不是并发)查询能力的TLB。
  • TLB中并没有存放所有的页表项,只是存放了部分页表项。
  • 在有TLB的CPU中,内存中仍需要具有全部的页表项。
  • 在有TLB的CPU中,地址变换过程:
(1)地址变换机构自动将逻辑地址分为页号和页内地址。(2)将页号与TLB中“所有”页号进行比较。若有匹配的页号则执行第(3)步,否则执行(4)(3)若有匹配的页号则代表所要访问的页表项在TLB中。根据页表项获取物理块号(页框号),然后物理块号(页框号)与页内地址拼接成物理地址。(4)若没有匹配的页号则代表所要访问的页表项不在TLB中,此时需要访问内存中的页表,并获取页表项中的物理块号(页框号)。同时将此页表项读入TLB中,若TLB已满则OS需要找到一个旧的并被认为不再需要的页表项,将其换出TLB。
  • 由于成本的原因,通常TLB不会做的很大,通常只存放16~512个页表项。
  • 对于小作业和中等作业,可以将全部页表项放入TLB中,但是对于大作业,只能将其中一部分页表项放入TLB中。
  • 由于程序和数据的局部性原理,从TLB中找到所需页表项的几率为90%以上。
  • 由于TLB,由于地址变换造成的CPU处理速度损失可减小到10%以下。虽然CPU的处理速度仍然不如连续内存分配,但是内存的空间利用率提高了。

2.3.两级页表和多级页表

2.3.1.两级页表和多级页表的引入

  • 在现在的计算机系统中,都支持非常大的地址空间(2^32~2^64,由CPU中的机器字长决定)。由于内存空间的增大,导致页表的页表项数要占用的更多的内存空间。
  • 假设在32位的逻辑地址空间中,页面大小为4KB,则页内地址占用12位,剩余20位给页号使用,则页表项的个数为2^20=1M。假设每个页表项占用4Byte(20位用处存物理块号,其他位用于访问控制或保留),则要页表要占用1MB的内存空间,且必须是连续的内存空间(思考为什么要是连续的地址空间?)。
  • 为了解决上述问题,有以下两个措施:
    1.用离散分配方式在内存中(不考虑TLB)存储页表(因为页表占用的连续内存空间太大,而分页系统中的内存空间都是由离散的物理块(页框)构成的,可能在内存空间中找不到一块这么大的连续内存空间)。
    2.只有当前需要的部分页表项调入内存,其余的页表项仍然驻留在磁盘上,需要用到时再调入内存。

2.3.2.两级页表

  • 利用外层页表对内层页表进行分页,并且离散的将内层页表中的所有页表项以连续几个页表项为一组(页表页面)分别存放在不同的物理块(页框)中。
  • 在外层页表的页表项中记录了页表页面的的物理块号。
  • 以32位的逻辑地址空间为例,介绍地址结构:
地址结构:10位外层页号+10位外层页内地址(内层页号)+12页内地址。10位的外层页号对应着外层页表中的页表项的索引。10位的外层页内地址(内层页号)对应着内层页表中页表项的索引。12位的页内地址对应着真实数据在物理块(存放真实数据的物理块)中的偏移。由地址结构可知,该外层页表的页表项的总个数为2^10=1M,每个内层页表的页表项的总个数为2^10=1M个,页面大小(物理块大小,页框大小)为2^12B=4kB。
  • 以32位的逻辑地址空间为例,介绍地址转换步骤:
1:用外层页表寄存器用于存放外层页表的始址和外层页表长度(外层页表中页表项的总个数)。在下面的步骤中为了方便,不考虑地址越界中断,所以外层页表长度和内层页表长度不会使用到。2:以外层页号为索引检索外层页表读取外层页表的页表项。外层页表的页表项的位置 = 外层页表的始址+(外层页号*外层页表项长度)。3:从外层页表的页表项中读取内层页表的起始地址并获得整张内层页表。4:以外层页内地址(内层页号)为索引检索内层页表读取内层页表的页表项。内层页表的页表项的位置 = 内层页表的始址+(内层页号*内层页表项长度)。5:根据内层页表的页表项读取存放真实数据的物理块的物理块号(页框号),然后将存放真实数据的物理块的物理块号(页框号)与页内地址拼接成物理地址。

备注:外层页表的页表项中存放的是内层页表的始址(不是相对地址,是绝对地址),而内层页表的页表项中存放的存放真实数据的物理块的物理块号(页框号)。

2.3.3.多级页表

  • 对于32位的机器来说,二级页表是合适的。但是对于64位机器来说,如果页面大小还是4KB并且内层页表的大小(内层页表的页表项总个数)还是2^12,则余下4位用于外层页号,则有2^42=4096G个外层页表项,假设每个外页页表的页表项占用8Byte(64位用于存放内层页表的始址),则外层页表会占用8Byte*4096G=32768GB的内存空间,而且这个内存空间必须是连续的内存空间,这显然是不合适的。
  • 为了解决上述问题,可以引进三级页表或更多级的页表。
  • 对于64位的计算机而言,它能支持的物理内存空间为2^64Byte=1844744TB,但是在实际应用中并不要那么大的内存空间。因此在64位的OS中常将存储空间减为2^45Byte,这样便于使用三级页表管理内存空间。
原创粉丝点击