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

lxe*_*lxe 2 c linux embedded operating-system kernel

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

shmid = shmget(key, 16777216, IPC_CREAT | 0666)
Run Code Online (Sandbox Code Playgroud)

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

偶尔,当运行上面的shmget命令时,我得到一个页面分配失败.当我的可用RAM耗尽时,也会发生这种情况,但是当我有足够的RAA时,这也会偶尔发生.

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

caf*_*caf 5

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

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