2011-01-31 1 views
2

Я выделение большого блока разделяемой памяти с использованием shmget на встроенной системе:Как система V IPC имеет дело с фрагментацией при распределении большого блока памяти с помощью «shmget»?

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

Система работает под управлением uClinux (2.6.28 ядра Linux) с помощью Slab аллокатора. У меня нет MMU на процессоре.

Время от времени, при выполнении указанной команды shmget, я получаю отказ в распределении страниц. Это также происходит, когда у меня заканчивается доступная оперативная память, но это также случается раз в то время, когда у меня есть много доступных RAA.

Я подозреваю, что виновник является фрагментацией, но я не совсем уверен, поэтому мои вопросы могут возникнуть из-за того, что подсистема IPC требует непрерывной физической сегмента 16 Мб для этой процедуры и не может найти ее из-за фрагментации память, бросая отказ в распределении, или проблема лежит в другом месте?

+0

Если это связано с фрагментацией, ваш журнал ядра будет иметь что-то в строке «Ошибка выделения страницы: порядок x» и несколько строк ниже списка свободных фрагментов памяти: 'x * 4Kb y * 8Kb z * 16Kb ... 'и так далее. «Порядок» - это количество бит, которое вы меняете, чтобы получить размер выделения. – ninjalj

+0

@ninjalj yup, это ошибка, которую я получаю. – lxe

ответ

5

В системе !MMU у вас нет виртуальной памяти, поэтому ваше предположение верно - для этого сопоставления требуется непрерывный блок физической памяти.

Вы можете устранить эту проблему, реорганизовывая приложение, чтобы использовать несколько небольших блоков разделяемой памяти и/или сначала распределить общую память как можно раньше после загрузки.

+0

Я не думал о том, чтобы выделить сегмент сразу после загрузки. Это может быть жизнеспособным решением, хотя это будет память. – lxe

Смежные вопросы