我完全迷路了,让我们说:
n = 10 和 p (必需的有效负载)= 800 字节,
这是否意味着在作为第9个分配请求的 n = 9 上,P 9 需要为792个字节(假设单个最小分配为8个字节)?我的理解正确吗?
答案 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 是从请求0
到k
的P i 图的峰值。每次分配都会增加堆利用率,尽管释放会降低堆利用率。
您需要足够的堆内存来满足您同时分配的最大内存量,但是如果您拥有更多的内存,那么其余的都将被浪费掉。最大限度地利用峰值利用率意味着试图找到最佳解决方案。