(动态内存分配)为什么最大化峰值利用率?

(Dynamic Memory Allocation) why maximize peak utilization?

我在看一本教科书,上面说:

我完全迷路了,让我们说:

n = 10p(所需有效负载)= 800 字节,

这是否意味着在第 9 个分配请求的 n = 9 上,P9 需要 792 字节(假设一个单个最小分配是 8 个字节)?我的理解正确吗?

这背后的假设是内存是一种宝贵的商品,我们应该尽量避免浪费它。如果峰值利用率很低,则意味着为未使用的堆保留了大量内存。

峰值利用率不指代任何特定的分配。 Pi 是来自 i 个连续请求的总负载。因此,在此分析中引用单个 p = 800 bytes 没有意义。 maxi≤kPi 是 Pi 的图的峰值来自 request 0k。每次分配都会增加堆利用率,尽管释放会降低它。

您需要足够的堆内存来满足您同时分配的最大内存量,但如果您有更多内存,那么其余的都将被浪费。最大化峰值利用率意味着尝试找到这个最佳点。

据我理解的文本,分配器 objective 是最大化 Pi (即时分配的内存总和 i). k 的峰值利用率是在 k.

时可以分配的最大值除以堆大小的比率

由于在i处有多个allocfree,如果allocator太基础并且不能很好地处理请求,它可能无法回答另一个分配请求(例如由于堆碎片,请参见下面的示例)。

智能分配器可能允许最大负载,但代价是响应较慢。

相反,您可能有一个快速分配器,在多次请求后可能无法最大化总负载 Pk

举一个(简单的)例子,有那个请求链

R1: alloc(1000)
R2: alloc(2000)
R3: alloc(1500)
R4: free(R1)
R5: free(R2)
R6: alloc(3000) => use space from R1+R2?

在 R6 上,基本分配器可能无法理解它可以重用从 R1 和 R2 释放的 space,给出较低的 peak 比率,并且堆尺寸不必要地比它应该的高。

一个更聪明的人可能会这样做,但可能会以更多 CPU / 资源为代价。