2011-01-31 68 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系統中,您沒有虛擬內存,所以您的假設是正確的 - 該映射需要連續的物理內存塊。

通過重構應用程序以使用多個較小的共享內存塊和/或在引導後儘早分配共享內存,可以緩解此問題。