2011-01-31 71 views
2

我使用的嵌入式系统上的shmget分配共享存储器的大数据块:当使用“shmget”分配大块内存时,System V IPC如何处理碎片?

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

该系统使用slab分配器运行的uClinux(2.6.28 Linux内核)。我在CPU上没有MMU。

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

我怀疑罪魁祸首是碎片,但我不太确定 - 所以我的问题是,是否可能导致此错误,因为IPC子系统需要连续物理16Mb段用于此过程,并且由于碎片而无法找到一个记忆,抛出分配失败,还是这个问题在别处?

+0

如果这是由碎片造成的,你的内核日志将会出现`page allocation failure:order x`和几行下面的空闲内存块列表:`x * 4Kb y * 8Kb z * `16Kb ...`等等。 “顺序”是您移动页面大小以获取分配大小的位数。 – ninjalj 2011-01-31 23:05:51

+0

@ninjalj yup,这是我收到的错误。 – lxe 2011-02-02 22:28:09

回答

5

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

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