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

C (动态内存分配)为什么要最大化峰值利用率?,c,malloc,heap,dynamic-memory-allocation,virtual-memory,C,Malloc,Heap,Dynamic Memory Allocation,Virtual Memory,我在读一本教科书,上面写着: 我完全迷路了,让我们说: n=10和p(所需有效负载)=800字节 这是否意味着在n=9即第9个分配请求上,P9需要792字节(假设单个最小分配为8字节)?我的理解正确吗?这背后的假设是,记忆是一种珍贵的商品,我们应该尽量避免浪费它。如果峰值利用率较低,则意味着为堆保留了大量未使用的内存 峰值利用率并不指任何特定的分配。Pi是i连续请求的总有效负载。因此,在本分析中引用单个p=800字节是没有意义的。马克西≤kPi是从请求0到k的Pi图的峰值。每个分配都会增加堆的

我在读一本教科书,上面写着:

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

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


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

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

峰值利用率并不指任何特定的分配。Pi是
i
连续请求的总有效负载。因此,在本分析中引用单个
p=800字节是没有意义的。马克西≤kPi是从请求
0
k
的Pi图的峰值。每个分配都会增加堆的利用率,尽管释放会降低堆的利用率


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

据我所知,分配器的目标是最大化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释放的空间,从而提供较低的峰值比率,并且堆大小没有必要比它应该的大


一个更智能的应用程序可能会这样做,但可能会以牺牲更多的CPU/资源为代价。

你所说的
p
是什么意思?@melpomene引用的文本中提到:如果应用程序请求一个p字节块,…是的,“如果”。您是说您有一个请求800字节的应用程序吗?如果是这样,在哪个请求R_i中会发生这种情况?请注意,您所指的句子是术语payload的定义
p
实际上是该定义中的一个局部变量。@melpomene第9个请求有792个字节,第10个请求分配最后8个字节,但假设p=800字节,如何最大限度地提高峰值利用率?如果您只进行一次分配,那么您应该有一个只有800字节的堆。