【问题标题】:(Dynamic Memory Allocation) why maximize peak utilization?(动态内存分配)为什么要最大化峰值利用率?
【发布时间】:2019-05-11 00:49:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • p 是什么意思?
  • @melpomene 在引用的文本中:如果应用程序请求一个 p 字节的块,...
  • 是的,“如果”。你是说你有一个请求 800 字节的应用程序吗?如果是这样,这发生在哪个请求 R_i 中?
  • 请注意,您所指的句子是术语 payload 的定义。 p 实际上是该定义中的局部变量。
  • @melpomene 第 9 个请求有 792 个字节,第 10 个请求分配最后 8 个字节

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


【解决方案1】:

据我理解,分配器的目标是最大化 Pi(在瞬间 i 分配的内存总和)。 k 的峰值利用率是可以分配的最大值除以 k 处的堆大小的比率。

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

智能分配器可能允许最大负载,但会降低响应速度。

相反,您可能有一个快速分配器,它可能无法在多次请求后最大化聚合有效负载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 比率,并且堆大小没有必要高于其应有的大小。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 但是假设 p = 800 字节,如何最大化峰值利用率?
    • 如果你只做一次分配,那么你应该有一个只有 800 字节的堆。
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2012-01-27
    • 2019-04-09
    • 2011-06-20
    • 2013-08-15
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多