动态存储管理(小结篇)-待完善

动态存储管理
  假设在系统刚开工时, 整个内存区是一个“空闲块”(在编译程序中称为“堆”)。
  下图a为依次给8个用户进行分配后的系统的内存状态。
  下图b为一段时间后,有的用户运行结束,它所占用的内存区变成空闲块,这时整个内存区呈现出占用块和空闲块犬牙交错的状态。
  假设又有新的用户进行系统请求分配内存,那么系统通常有两种做法:
  1 继续从高地址的空闲块中进行分配,而不理会已分配给用户的内存区是否空闲,直到分配无法进行时,系统才区回收所有用户不再实用的空闲块,并且重新组织内存,将所有空闲的内存区连接在一起成为一个大的空闲块。
  2 用户一旦运行结束,便将它所占内存区释放成为空闲块,同时,每当新的用户请求分配内存时,系统需要巡视整个内存区中所有空闲块,并从中找出一个“合适”的空闲块分配之。此时系统需建立一张记录所有空闲块的“可利用空间表”,此表的结构可以是“目录表”,也可以是“链表”。如下图所示,无论那种,表结构中每一项都要包含至少3个信息:初始地址、空闲块大小和使用情况。

  2.1 可利用空间表及分配方法
    可利用空间表中包含所有可分配的空闲块,每一块是链表中的一个结点。当用户请求分配时,系统从可利用空间表中删除一个结点分配之;当用户释放其所占内存时,系统即回收并将它插入到可利用空间表中。因此,可利用空间表也叫作“存储池”。大致可以以下3中不同结构形式的可利用空间表。
  2.1.1 系统运行期间所有用户请求分配的存储量大小相同。
    这种情况,可以把初期将内存区按所需大小分割成若干相同大小的块,并用指针连接成一个可利用空间表。分配时,可直接将第一个结点分配用户;释放时,将用户释放的空闲块插入在表头即可。这时,可利用空间表实际上就是一个链栈。
  2.1.2 系统运行期间用户请求分配的存储量有若干种大小的规格。
这种情况,可以建立若干个可利用空间表,同一链表中的结点大小相同。每个结点中的第一个字设有链域(link,下一个结点地址),标志域(tag,空闲或者占用)和结点类型(type,可以由类型知道结点大小);如下图所示。此时的分配和回收方法基本和上种情况类似。只是当
  2.1.3 系统运行期间分配给用户的内存块的大小不固定,可以随请求而变。

原文地址:https://www.cnblogs.com/aimmiao/p/10251629.html