在使用“shmget”分配大块内存时,System V IPC如何处理碎片?

时间:2011-01-31 21:33:29

标签: c linux embedded operating-system kernel

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

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

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

偶尔运行上面的shmget命令时,我的页面分配失败。当我的可用内存不足时,也会发生这种情况,但是当我有足够的RAA时,这种情况也会偶尔发生。

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

1 个答案:

答案 0 :(得分:5)

!MMU系统中,您没有虚拟内存,所以您的假设是正确的 - 该映射需要一个连续的物理内存块。

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