操作系统——内存分区与内存分页

一、内存分区

1.可变分区和适配算法

将程序载入到内存中,每条指令执行前进行重定位,我们就可以使内存活起来了,程序在内存中得到执行。但还存在一个问题,就是当程序分段载入到内存中时,我们如何正确地给每一段分配合理的大小空间?

这就引出了这一节讨论的内容——给内容分区。我们根据内存分区算法,将内存划成可变的分区,当段请求一定大小的内存时,我们找到一块可以容纳该段程序的内存空间,将对应大小的内存划分给它。

 要从内存中找到空闲区域来满足段的请求,关键是要对空闲内存区域的信息进行记录和维护,因此我们需要如上图所示的分区表。例如当有一个段长度为100KB的请求到达,查看分区表,发现有一块起始地址为250KB的区域长度大于100KB,那么从这个空闲区域中划分100KB大小的一块,那么此时空闲内存区域又发生了如上图右边所示的变化,要对分区表进行更新。

操作系统中的进程也会在结束退出时释放内存,如上图进程2释放了基址为200KB、长度50KB的一块内存,而若此时到达了一个长度为40KB的内存请求,就有两块大小大于40KB的内存空间可以用来分配。那么该如何分配了?这就有不同的几种分区适配方法。

最佳适配方法就是找到内存长度与请求差距最小的一块内存进行分配,如图就是将50KB大小的分区分配给该请求。这里会出现10KB大小的内存浪费,虽然表面上看最佳适配方法会造成最小的浪费,而如果多余的内存空间足够大的话,被其他长度要求更小的请求所使用的可能性也很大,而最佳适配方法会导致多余内存的空间越来越小,得到使用的可能性很小。

最差适配方法最佳适配方法相反,每次分配的区域是与请求长度嘴不匹配的一段,如图就是将长度150KB的区域分配给该请求,这样还剩下110KB的长度,剩余内存得到使用的概率很大。

最先适配法就是不去考虑分配后剩余内存的大小,而是把最先找到的复合大小要求的内存空间分配出来,这样的执行速度是最快的。

2.内存碎片

 如上图所示的物理内存,当到达了一个长度为160KB的请求,由于空闲的两块内存大小分别为150KB和50KB,都不能满足长度需求,所以导致该程序段不能找到合适大小的物理内存分区。但实际上剩余的内存长度为150KB+50KB=200KB>150KB,但因为这些区域是分散的,所以导致了内存浪费,这些无法被利用的空闲区域被称作内存碎片

如果想将这些内存碎片利用起来,最直观的方法就是移动内存,把分散的内存碎片重新整合成一块较大的空闲内存区域,但移动内存是需要消耗时间的,如果移动速度为10MB/s,那么移动1G的内存就需要将近100秒,这是不可接受的。

我们如果将内存当成是面包,不同的食客想要吃的面包分量大小是不同的,为了方便他们的选取,可以将面包切成薄薄的小片,供食客自己选取。同样的道理,如果我们将内存分成类似的小片,比如一片是10KB,那么剩余的内存碎片就可以被分成20个小片,如果程序段的大小为160KB,那么它只需要使用16个小片就可以了。这些小片就是内存页


二、分页

1.分页机制

 

分页机制首先将内存分成相同大小的页框,然后将要放入内存的程序段划分成和页框相同大小的页,然后将这些页映射到页框中去,得到如上图右边所示的结果。但除了将程序段放到内存中去,还需要让内存中的程序可以被取值——执行,需要完成重定位的问题。

 例如要执行“mov [0x2240], %eax”,假定页框的大小为4KB,用0x2240去除以4KB,相当于左移12位,得到0x02,说明页号为2,对应的页框号为3,那么物理地址就是0x3240。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值