操作系统-非连续内存分配:分段、分页、分表004

一、为什么需要非连续内存分配

1.连续内存分配的缺点

  1. 分配给一个程序的物理内存是连续的
  2. 内存利用率较低
  3. 由外碎片、内碎片的问题.

2.非连续分配的优点

  1. 一个程序的物理空间是非连续的
  2. 更好的内存利用和管理
  3. 允许共享代码和数据(共享库等…)
  4. 支持动态加载和动态链接

3. 非连续分配:缺点

  1. 如何建立虚拟地址和物理地址之间的转换

二、两种硬件方案:分段和分页

1、软件方案(开销大)
程序的分段地址空间。每一次的内存访问,通过软件的映射,这个开销是很大的。所以需要硬件机制来实现内存的分段机制。
2、 硬件方案

1、非连续内存分配:分段

  • 分段:分段机制就是想,根据应用程序的特点,来进行有效的分离和管理。

1.在分段的机制之下,应用程序看起来就是以下图。

计算机程序由各种部分组成的:1.代码执行方面有主程序、共享库、子程序,形成了代码不同的分段。2.数据方面:堆栈端、共享段。而我们需要一种方法将各种段区分出来,那么分段可以更好的分离和共享。
在这里插入图片描述

2.分析逻辑地址和物理地址

  1. 从应用程序编写和运行来说,虚拟的逻辑地址空间是一个连续的地址空间,虽然是连续的,但是我们可以有效的隔离。将各种段进行分离,好处就是:可以让用户的代码段,和主程序段能够相互共享。而有些数据与数据之间是相互隔离的。更有效的管理和分配,更容易实现保护机制。
  2. 左边是连续的逻辑地址,右边是不连续的物理地址。那么中间是需要映射机制,相互之间进行对应的关联。
    在这里插入图片描述

3.逻辑地址通过映射到内存中

  • 可以把运行的执行程序的逻辑地址:看成一个连续的一维线性数组,通过映射关系把不同的内存块(代码、数据、堆栈)分别不同的映射到内存中去。
    在这里插入图片描述

4.分段寻址方案

  1. 一维逻辑地址是有不同的段组成的,段可以不连续。将一维逻辑地址分为两块,一块是段寻址,一块是段内偏移寻址
    在这里插入图片描述

5.分段的具体实现:

  1. 从一个线性逻辑地址,从段空间映射到物理空间。物理空间是由不同的段组成的。
  2. 左上角是正常运行的程序p,通过CPU运行各种指令,CPU就要去寻址(找到数据、代码在什么地方),地址会采用单一的段地址管理机制,把逻辑地址分为两块:上半部分是断号,下面是段内偏移。
  3. 通过断号希望能找到,段所在物理空间的起始地址。需要硬件机制,称为【段表】
  4. 段表存在映射关系,逻辑地址的段号和物理地址的断号相对应关系。
  5. 每个段大小不一样,需要了解段的起始地址、和限制是多少。这个信息放在段表里面的。
  6. 段表有两部分:1.段的起始地址。2.段的长度限制。
  7. 操作系统来建立段表之后,段机制就会正常工作了。段表的索引项index,段号来决定的,段号决定了段表的哪一项位置。就可以知道段的物理地址的起始地址以及长度限制。CPU就会做比对,段的限制是否满足本身表示的地址,如果满足,则是合法的寻址,如果不满足,那么超出了段的范围,就是非法访问。CPU产生异常交给操作系统,操作系统来决定访问是否有问题,有问题则kill。
  8. 如果访问合法,地址符合段的限制,那么将起始地址 加上 逻辑地址的偏移量 =物理地址。
  9. 根据最右侧的图,根据物理地址去查找相应数据,进行取出来,交给CPU做进一步处理。

在这里插入图片描述

三、非连续内存分配:分页

分段在现有的CPU硬件环境中用的比较少的。现在绝大数CPU还是用分页机制比较多。

1、分页地址空间

  1. 分页的页尺寸是固定不变的。
    在这里插入图片描述
  2. 页帧:是物理地址内存布局方式。由两部分组成,页帧号,页帧的偏移地址。

在这里插入图片描述
3. 页帧的例子:物理页的寻址方式
有一个16位的物理地址空间,每一个页帧大小512字节,也意味着偏移地址9个bit。给出页帧号为3,页帧偏移地址是6.物理地址的位置是:1543.
f代表页帧号=3. 页帧偏移地址为6.
在这里插入图片描述

2、逻辑页寻址方案

用页来表示,页的set和页帧号的set可能不一样。 每个页的和页帧大小是一样的。
在这里插入图片描述

1.如何完成地址装换

  1. 当一个程序需要运行时,本身的逻辑地址是一个连续的地址空间,是由每一个页组成的,每页的大小是相同的。整个程序的容量可能和物理空间是不一样的。程序占了很大的空间,但是物理地址可能没有那么大。
  2. 如何完成映射?程序运行时,CPU会去寻址,无论是执行指令还是访问数据,都需要指令和数据的位置。而寻址需要知道地址,地址是逻辑地址或者虚拟地址。逻辑地址是由CPU下面的图来表示的,地址分了两块,一块是页内偏移地址o,一块是页号p。页号作为一个index索引,根据页号就可以在[pagetable]查出所对应的号是多少(pagetable相当于数组)。(总结前面一句话,通过页号知道了蒸号+Offset=物理地址)。知道了物理地址,就可以根据物理地址找到对应的物理位置。
  3. pagetable是由操作系统来建立。

2.分页机制需要注意的地方:

  1. 页内偏移地址是固定不变的。
  2. 逻辑页的空间大小,和帧物理组织的大小不一致。一般来说逻辑空间地址大于物理地址空间,
  3. 逻辑地址是连续的,但是物理内空间不一定连续了。这样有利于减少碎片。

在这里插入图片描述

四、页表

页表如何实现?如何高效、节省空间?

1、页表概述

  1. 页表就是一个大数组,索引就是页号,索引所对应的页表项的内容就是帧号。
  2. CPU会查页表在什么地方,起始地址在什么地方。
  3. CPU由逻辑地址的页号去页表中差对应的物理内存的页号
  4. 通过物理页号加上偏移地址得到实际的物理地址

2、列表转换的例子

  1. 内存空间的大小,逻辑地址空间有16bit,说明有64k的地址空间,但是物理空间只有32kb,逻辑空间和物理空间不一致。但是每页的偏移是一样的,每页的大小是一样的。页和页帧大小都是1K(1024)
  2. (4,0)逻辑页号是4,页内偏移地址是0.
  3. (3,1023)逻辑页号是3,页内偏移地址是1023.对应物理页内是多少呢??
  4. 首先CPU找逻辑地址,
  5. 看(4,0)。看页表,红的的滞留位:0代表不存在,1代表存在。这物理页就是页帧,在内存是不存在的。如果CPU访问了这个地址,产生一个异常。
  6. 看(3,1023)。红色的滞留位:是1代表对应的物理页帧,确实在物理中存在。对应的页帧号是(00100)——》帧号是4. 对应的物理地址的页帧号是4。 页帧的偏移是1023。
  7. 页表项有两种情况,物理页帧是否存在。物理页帧不存在,出现异常,操作系统就会进一步处理。存在就找到物理存在的地址。

在这里插入图片描述

从逻辑地址到物理地址的转换,问题是:1是空间的代价问题。2是时间的开销问题。
我们希望是占用空间越小越好,效率和速度越快越好。
每个应用程序都有自己的页表,那么页表所占空间非常大。空间大了CPU放不下,如果放内存里面,每次寻址,需要去内存寻址,那么时间消耗很大。

  • 那么解决时间空间问题,
  1. 就是【缓存】,将常用的内容,放到离CPU很近的地方。
  2. 就是【间接访问】,将大的空间,拆分小的空间。

2、转换后缓冲区(TLB)

cache缓冲,就是缓冲页表内得内容。

  1. TLB是一个特殊的区域,位于CPU内部,包含两项一个是p/f值。key和value这两对形成TLB的表象。可以将经常访问的页表项,放到TLB。从而提高速度。这样不需要查页表了,当CPU得到逻辑地址后,根据P查询TLB,得到F。f加上偏移地址直接得出物理地址,这样就直接根据物理地址找内容。这样就避免了对页表的访问。
    2.当访问TLB不到的时候,CPU就会去查页表,页表有对应的一项,如果存在位是1的话,那么就把Fram num号取出来,那么交给TLB进行存储机制。将常用的放到TLB。不常用的去页表中进行查询,取出来,在交给TLB。

在这里插入图片描述

五、二级、多级页表

1、TLB将速度解决了

通过TLB有效的把常用的页表项,缓存到CPU中。从而地址关系很快,多次去查询页表,从而多次访问内存。这样速度上有效的解决了。

2、那么页表的空间问题如何解决呢?

  1. 可以用多层次多级的页表来缓解问题。

1. 二级页表:时间换空间。

将物理号分为两部分,偏移地址没有变。这个使得大地址的寻址,变成n个小的page table的寻址。
过程:
1.将物理页号分为两块为P1p2,寻址是首先找的是P1级列表,1级的起始列表CPU是知道的,加上index,可以在页表项进行查找,存上二级页表的起始地址。 二级起始地址知道后,
2.由于两页表,开销边大。通过这种方式使得,某一项不存在映射关系页表项,没必要占用内存了。P1指向的页表项,不存在的话(也就是说滞留位是0,代表映射关系不存在)。那么二级pagetable没必要 在里面放着了。
在这里插入图片描述

2. 多级页表,建立页表树

在这里插入图片描述

六、页表-反向页表

问题:页表的大小都和逻辑地址空间大小有对应关系,逻辑空间越大,起始页表越多。页表的大小与逻辑空间的大小,尽量减小关系。尽量与物理空间大小建立关系。
都是以逻辑页的页号作为index索引大数组,那么能不能用(页帧号就是物理页号)物理页作为index,来查找对应的逻辑页号呢?
在这里插入图片描述

1、基于页寄存器的方案

  1. 可以理解为:有一个也寄存器的数组,里面的index变了,不是页号,而是物理页号(页帧号),根据物理页号可以查出页号是多少。
  2. 页帧号为索引,内容为页号。(前面将的是页号为索引,页帧号为内容)
  3. 这种方式使得,计算机的容量,之和物理页地址大小相关,而与逻辑地址大小是无关的。限制了计算机的数量。

在这里插入图片描述
问题是:如何根据页号找到页帧号? 好处是占的空间很小
在这里插入图片描述
在这里插入图片描述

2、基于关联内存的方案

可以并行的根据页号,查找页帧号。K是页号,V是页帧号
在这里插入图片描述
在这里插入图片描述

3、基于哈希查找的方案

用硬件加速的方式。为了提高效率,把哈希再加一个函数PID(当前运行程序的ID)。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43989347/article/details/120134990