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

时间:2018-12-10 06:02:43

标签: c malloc heap dynamic-memory-allocation virtual-memory

我正在读一本教科书,上面写着: enter image description here

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

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

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

2 个答案:

答案 0 :(得分:1)

据我所知,分配器的目标是最大化 Pi (瞬时 i 分配的内存之和)。直到 k 的峰值利用率是可分配的最大值除以 k 处的堆大小的比率。

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

智能分配器可能允许最大的有效负载,但以响应速度较慢为代价。

相反,您可能拥有一个快速分配器,该分配器可能无法在多次请求后最大化总有效载荷 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释放的空间,从而导致 peak 比率较低,并且堆大小不必要地超出了应该的大小。 / p>

一个聪明的人可能会做,但是可能要花更多的CPU /资源。

答案 1 :(得分:0)

基于此的假设是记忆是一种宝贵的商品,我们应该避免浪费它。如果峰值利用率很低,则意味着有大量内存供未使用的堆使用。

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

您需要足够的堆内存来满足您同时分配的最大内存量,但是如果您拥有更多的内存,那么其余的都将被浪费掉。最大限度地利用峰值利用率意味着试图找到最佳解决方案。