Распределитель памяти в C - как использовать пространство sbrk ()

Я писал о реализации malloc и хотел знать, не может ли кто-нибудь помочь мне с этой проблемой.

По сути, я хотел бы повторно использовать память после ее выделения с помощью sbrk () и убедившись, что память свободна.

По сути, представьте, что моя память такова, как это

|------------------------------|

... и я делаю некоторые отчисления. Когда я выделяю память, у каждого бита есть заголовок (h) и данные (d).

|hddddddhddd---hdd--hddd-------|

Теперь у меня есть эти дыры, и если я хочу использовать, скажем, первый пробел в моей диаграмме, как мне настроить его так, чтобы у него также были голова (h) и тело (dd)?

Я дошел до того, что теперь у меня есть указатель на область памяти, которую я хочу. В С его указывает указатель. Указатель имеет пользовательский тип, где «meta» - это структура, которую я определил. Так что теперь у меня есть

metaStruct * mypointer = the memory address.

Но когда я пытаюсь сделать

mypointer->size = 30;

или

mypointer->buddy = 1;

Я получаю сегфо.

Вопрос: как мне настроить его так, чтобы адрес памяти, выделенный с помощью sbrk (), имел форму моей структуры? Очевидно, я не могу просто пойти myPointer = malloc (sizeof (metaStruct)), потому что я пишу сам malloc. Я также не заинтересован в том, чтобы sbrk () занимал больше места, а скорее использовал существующее пространство, на которое я указываю (я хочу игнорировать его ненужные данные и использовать пространство).

Как мне это сделать?

4 голоса | спросил Navin Aggrawal 26 MarpmSat, 26 Mar 2011 13:19:30 +03002011-03-26T13:19:30+03:0001 2011, 13:19:30

1 ответ


0

Насколько я знаю, p = sbrk (n) увеличивает доступное адресное пространство (как минимум) n байтов и возвращает базовый адрес новой выделенной области в "p". Теперь у вас есть блок памяти, начинающийся с «p» и длиной n байтов (вероятно, больше, чем n, это зависит от системы).

Итак, я полагаю, что ваш metaStruct содержит поле «size», поле «next free area» и поле «data»,

metaStruct * m ;
p=sbrk(sizeof(metaStruct)+ data_size);
m = (metaStruct *)p;
m->size = data_size;
m->next = NULL;
memcpy(m->data, ...,data_size);

Код не идеален, в некоторых системах функция sbrk (на самом деле это часто функция, а не базовый системный вызов - и, конечно, вы должны проверить, не работает ли sbrk), не возвращает выровненные указатели, поэтому вы должны выровнять указатель вручную. Кроме того, вы можете получить фактический выделенный размер, вызвав sbrk (0) после sbrk (n) и рассчитав разницу между двумя указателями. В общем, вы должны хранить коллекцию «свободных блоков» и пытаться использовать их сначала, а затем вызывать sbrk, только если ни один из них не достаточно велик.

ответил Giuseppe Guerrini 26 MarpmSat, 26 Mar 2011 13:47:17 +03002011-03-26T13:47:17+03:0001 2011, 13:47:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132