Я писал реализацию malloc и мне было интересно, может ли кто-нибудь помочь мне с этой проблемой.
По сути, я хотел бы повторно использовать память после выделения ее с помощью sbrk () и убедившись, что память свободна.
Итак, по сути, представьте, что моя память такая
|------------------------------|
... и я делаю некоторые распределения. Когда я выделяю память, каждый бит имеет заголовок (h) и данные (d).
|hddddddhddd---hdd--hddd-------|
Теперь у меня есть эти отверстия, и если я хочу использовать, скажем, первый пробел в моей диаграмме, как мне настроить его так, чтобы у него также была голова (h) и тело (dd)?
Я дошел до того, что теперь у меня есть указатель на нужное место в памяти. В C на него указывает указатель. Указатель имеет настраиваемый тип, где «мета» - это определенная мной структура. Итак, теперь у меня есть
metaStruct * mypointer = the memory address.
Но когда я пытаюсь сделать
mypointer->size = 30;
Or
mypointer->buddy = 1;
Я получаю ошибку.
Вопрос: как мне настроить так, чтобы адрес памяти, выделенный с помощью sbrk (), имел форму моей структуры? Очевидно, я не могу просто использовать myPointer = malloc (sizeof (metaStruct)), потому что я пишу сам malloc. Я также не заинтересован в том, чтобы sbrk () занимал больше места, а скорее использовал существующее пространство, на которое я указываю (я хочу игнорировать его ненужные данные и использовать пространство).
Как мне это сделать?
malloc(3)
реализации вызываютmmap(2)
сMAP_ANONYMOUS
, чтобы выделить новые обнуленные страницы для процесса. Поскольку выделения могут быть такими маленькими, как размер страницы, и могут быть возвращены в ОС в любом порядке, легче вернуть память в ОС из процесса. И может быть проще выделить новые страницы для хранения ваших собственных внутренних структур данных. - person sarnold   schedule 26.03.2011