记忆池(Memory Pool),又被称为固定大小区块规划(fixed-size-blocks allocation),允许程式设计师以类似 C语言malloc 或是 C++ 的 new 运算元进行动态的记忆体规划。对于其它动态记忆体规划的实践来说,因为会变动记忆体区块大小导致的碎片问题,导致在实时系统上受限于效能因此,根本无法使用。记忆池提供了一个更有效率的解决方案:预先规划一定数量的记忆体区块,使得整个程式可以在执行期规划 (allocate)、使用 (access)、归还 (free) 记忆体区块。

有许多实时作业系统采用了记忆池IBMTransaction Processing Facility 便是其中一个例子。

示例

编辑

这个简单的记忆池实践模组在编译期规划 3 个示例记忆池,其区块将大小针对程式的需求做最佳化。这个程式可以下列介面来规画、使用及归还记忆体区块:

  • 从记忆池中规划记忆体区块。这个函数会先检测目前的记忆池是否仍有足够空间可以规划所需的记忆体区块,若空间已不足,将继续尝试下一个记忆池。一个已规划的记忆体区块将使用handle来表示。
  • 获取一个指向已规划记忆体区块的指标
  • 归还之前规划的记忆体区块。
  • 用以代表记忆体区块的handle,可以使用像是 unsigned int 的资料型别来实践。

记忆池与 malloc 的比较

编辑

优点

  • 记忆池允许在执行期以常数时间规划记忆体区块,并且不会有记忆体破碎的情况产生。一次归还记忆体中成千上万个物件的记忆体区块只需要一个操作,无需像 malloc 一般需要个别 free。
  • 记忆池可以在阶层式的树状结构中被分群,非常适合某些特定的程式结构,例如递归迭代
  • 固定区块大小的记忆池不需将每次规划的资讯记录下来(例如规划的记忆体区块大小,因为每次规划都是一样的)。针对一些小而多的记忆体区块规划会节省一些空间。

缺点

  • 记忆池模组在使用时,必须依照程式需求来做个别调整,才能保持时间与空间效率。

外部链接

编辑