【问题标题】:How does System V IPC deal with fragmentation when allocating a large block of memory using "shmget"?使用“shmget”分配大块内存时,System V IPC 如何处理碎片?
【发布时间】:2011-06-18 21:19:01
【问题描述】:

我在嵌入式系统上使用 shmget 分配一大块共享内存:

shmid = shmget(key, 16777216, IPC_CREAT | 0666)

系统正在使用 Slab 分配器运行 uClinux (2.6.28 Linux Kernel)。我在 CPU 上没有 MMU。

有时,在运行上述 shmget 命令时,我会遇到页面分配失败。当我的可用 RAM 用完时也会发生这种情况,但是当我有大量可用的 RAA 时也会偶尔发生这种情况。

我怀疑罪魁祸首是碎片,但我不太确定 - 所以我的问题是,是否会导致此错误,因为 IPC 子系统需要一个连续的物理 16Mb 段来执行此过程,并且由于内存碎片而找不到一个,抛出分配失败,还是问题出在其他地方?

【问题讨论】:

  • 如果这是由于碎片造成的,您的内核日志将包含类似于page allocation failure: order x 的内容,以及空闲内存块列表下方的几行:x*4Kb y*8Kb z*16Kb ... 等等。 “顺序”是您移动页面大小以获得分配大小的位数。
  • @ninjalj 是的,这就是我收到的错误。

标签: c linux embedded operating-system kernel


【解决方案1】:

在!MMU 系统中,您没有虚拟内存,因此您的假设是正确的——该映射需要一块连续的物理内存。

您可以通过重构应用程序以使用多个较小的共享内存块和/或在启动后尽早分配共享内存来缓解此问题。

【讨论】:

  • 我没有想到在启动时立即分配段。这可能是一个可行的解决方案,尽管这会占用大量内存。
猜你喜欢
  • 2016-12-28
  • 2013-12-24
  • 2011-06-02
  • 2011-12-09
  • 1970-01-01
  • 2010-10-22
  • 2011-12-13
  • 2017-12-09
  • 2011-07-25
相关资源
最近更新 更多