内存分配和外部碎片和内部碎片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZCMUCZX/article/details/80338187

内存分配

其实最为简单的内存分配的方法就是将内存分为多个固定大小的分区,每个分区只能容纳一个进程,所以多道程序的程序数就会受到分区的限制,对于这种方法就是在一个分区空闲的时候就可以从输入队列当中选择一个进程,以便调入到空闲分区,当进程终止时,其分区可以被其他进程所使用,这种方法最开始是被IBM OS/360操作系统使用,当然现在不再使用,因为其的规模庞大,运行缓慢,没有什么人使用

在可变分区方案里,操作系统有一个表,用于记录哪些内存可用和哪些内存和哪些内存已经被占用,刚开始的时候,所有的内存都可用于用户进程,因此我们可以把这块内存看做是一个孔,当有新进程需要内存的时候,就去为该进程去查找足够大的孔,如果找到了,就可以从该孔为该进程分配所需的内存,孔内未分配的内存可以下次再去使用

在任意的时候都会有一组可用的孔大小列表和输入队列,操作系统根据调度算法来对输入队列进行排序,内存不断的分配给进程,直到下一个进程的内存不能满足为止,这个时候没有足够大的可用的孔来装入内存,操作系统就可以等到有足够大的空间,或者往下扫描输入队列以确定是否有其他内存需求较小的进程可以被满足

通常来说,一组大小不同的孔分散在内存当中,当新进程需要内存的时候,系统会为该进程查找足够大的孔,如果孔太大了,那么就会分为两块,一块分配给新进程,另一块就还给孔集合,当进程终止时,它将释放其的内存,这个内存就会还给孔集合,如果新孔与其他孔相邻,那么就会将这些孔给合并成大孔,这个时候,系统就可以去检查是否有进程在等待内存空间,新合并的内存空间是否满足等待进程

从一组可用的孔当中去选择一个空闲的孔有很多种方法,一种就是首次适应,还有就是最佳适应,还有就是最差适应

  • 首次适应:分配第一个足够大的孔,查找从头开始,也可以从上次首次适应结束时开始,一旦找到了足够大的空闲孔,就可以停止
  • 最佳适应:分配最小的足够大的孔,要去查找整个列表,除非列表按照大小排序,这样的话我们可以不用去遍历整个列表,这种方法可以产生最小剩余孔
  • 最差适应:分配最大的孔,同样的也必须去查找整个列表,除非列表按照大小排序,这种方法可以产生最大的剩余孔,该孔可能比最佳适应方法产生的较小剩余孔更为有用

其实首次适应和最佳适应方法在执行时间和利用空间方面都要好于最差适应方法,首次适应和最佳适应方法在利用空间方面差不多,不过首次适应方法会更快

外部碎片和内部碎片

外部碎片

随着进程装入和移出内存,空闲的内存空间被分为小片段,当所有的空闲的这些小片段的内存之和可以满足请求,但是并不连续的时候,这个时候就会出现外部碎片的问题,这个问题可能会很严重,这个就是外部碎片

内部碎片

比如说我们有一个2018B大小的孔,并且采用了多分区的内存分配方案,假如有一个进程需要2016B,如果我们去准确的分配所需要的块,那么还剩下一个2B的孔,维护这个小孔的开销要比孔本身大得多,因此,通常将内存以固定大小的块为单位来分配,如果采用这种方案的话,进程所分配的内存可能要比所要的要大,这两个数字之差就称为内部碎片,这部分内存在分区当中,不过不能使用

解决外部碎片问题的方法

  • 1、紧缩法,紧缩的目的就是移动内存内容,以便所有空闲空间合并成一整块,但是紧缩并不是所有的程序都是可以的,因为如果重定位是静态的,也就是说在汇编时或装入内存的时候进行的,那么就不能紧缩,紧缩只是在重定位是动态并且在运行时可以采用,如果地址被动态重定位,就可以去移动程序和数据,然后去根据新基地址的值来改变基地址寄存器,如果我们采用了紧缩,我们还要去估计其的开销,最简单的合并算法就是去将所有进程移动内存的一端,而将所有的孔移动到内存的另一端,这样以生存一个大的空闲快,不过这种方案的开销大
  • 2、还有一种就是可以是允许物理地址空间为非连续,这样的话,我们只需要有物理地址就可以为进程去分配空间了

静态重定位

静态重定位就是在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变

动态重定位

动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。

展开阅读全文

没有更多推荐了,返回首页