Как написать простую функцию malloc в c

Как назначение в операционных системах, мы должны написать собственный код для malloc и бесплатно на языке программирования C, я знаю, если бы я спросил код для этого, мне не нужно учиться. Я столкнулся с проблемой не знать, куда включить инициализацию массива char с 50000 байтами и сделать два списка свободными и используемыми. в моей функции я не могу запустить malloc или автоматически автоматически. и основная программа третьей стороны будет использоваться для проверки моих функций ….. если мой файл – mymalloc.c или что-то

void* myalloc(size_t size) { //code for allocating memory } void myfree(void *ptr) { //code for free the memory } 

где будет происходить код для запуска пространства памяти и списков.

Я думаю, вам нужно только реализовать диспетчер памяти. Поэтому вам не нужно использовать brk , sbrk , … Просто поместите использованную память в простой массив и каким-то образом ее fragmentируйте. Поскольку это домашняя работа, вы хотите сделать ее максимально простой, или же у вас возникают проблемы из-за сложности / временных ограничений вашего задания.

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

Возможно, это тоже хорошее чтение.

Не делайте что-то низкоуровневое, как было предложено в других ответах.

Реализация во многом зависит от операционной системы и архитектуры, так или иначе вы можете взглянуть на это: http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html

(и изучите, как это работает!).

Если вы находитесь в системе unix, вы можете посмотреть руководство по brk и sbrk . Эти системные вызовы «нажимают / устанавливают» предел кучи.

Используя их, вы можете управлять своими страницами памяти, распределяя их по мере необходимости.

Я бы посоветовал прикованный список управлять вашими выделенными пространствами и функциями здания, чтобы разделить их или объединить их, если они свободны.

Если вам нужно попробовать свой код с приложениями высокого уровня, вы можете назвать свои функции malloc / free, скомпилировать их для общего объекта (.so), а затем использовать LD_LIBRARY_PATH среды LD_PRELOAD и LD_LIBRARY_PATH для загрузки вашего .so и замены malloc системы ,
Каждая команда, которую вы вызываете, будет использовать ваш общий объект и, следовательно, ваш malloc, сообщая вам, стабилен ли ваш malloc или не соответствует действительности.

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

Во-первых, вы можете сделать поддельный malloc, который всегда терпит неудачу

  /* fake malloc */ void* myalloc(size_t sz) { return NULL; } 

но это «обман». Вы хотите сделать malloc который полезен.

Вероятно, вы хотите сделать системный вызов, который запрашивает kernel ​​для памяти. Конечно, для освобождения памяти вам понадобится симметричный syscall. В Linux и многих системах Posix вы часто используете системные вызовы mmap и munmap .

(Вы также можете использовать sbrk , но использование mmap с munmap проще и более общим)

Идея состоит в том, что вы получаете большие куски памяти (с mmap ), а затем вы управляете меньшими зонами памяти внутри. Интересная деталь заключается в том, как управлять этими меньшими зонами. Вы можете иметь дело с большим malloc иначе, чем «небольшие» распределения.

Вы действительно хотите прочитать страницу wikipedia по распределению памяти

У вас может быть глобальная статическая переменная, которая инициализируется до нуля. Затем проверьте эту переменную в начале вашего malloc и free функцию. В вашей функции malloc , если переменная равна нулю, инициализируйте все, что вам нужно, а затем установите для переменной ненулевое значение. В вашей free функции просто верните, если переменная равна нулю.

Более того, это простой malloc:

 void* my_malloc(size_t size) { return (sbrk(size)); } 

человек sbrk поможет вам.

Теперь проблема состоит в том, чтобы создать бесплатный и создать эффективный malloc 🙂

если вы хотите протестировать свой malloc, вы можете сделать вот так:

$> LD_PRELOAD = / mypath / my_malloc.so / bin / ls

но вам нужно создать динамическую библиотеку раньше, потому что malloc – это .so

Я дам вам базовую концепцию, которую вы можете использовать для написания собственного кода для функций malloc () и free () с использованием C.

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

  2. Мы используем простой связанный список для переноса данных, связанных с выделенными, а также свободными блоками памяти.

Его структура такова.

 struct block{ size_t size; /*Specifies the size of the block to which it refers*/ int free; /*This is the flag used to identify whether a block is free or not*/ struct block *next; /*This points to the next metadata block*/ }; 
  1. Для этого вам понадобятся 2 исходных файла. Одним из них является mymalloc.h, который является файлом заголовка, который содержит части инициализации и прототипы функций остальных функций, которые мы собираемся реализовать. Другой – исходный файл mymalloc.c, который содержит все необходимые функции.

  2. Должна быть функция для инициализации первого блока свободной памяти. И еще одна функция, чтобы разделить блок памяти, который имеет более чем достаточно места для предоставления требуемого размера. И еще один способ сканирования через связанный список и слияние любых последовательных блоков, которые являются свободными, чтобы предотвратить внешнюю fragmentацию.

Примечание. Мы используем алгоритм First-fit, чтобы найти свободный блок для выделения памяти.

Я думаю, что это поможет любому, кто ищет простой способ написать свои собственные malloc и бесплатные функции, используя C. Пожалуйста, следуйте следующей ссылке, чтобы получить подробное объяснение.

http://tharikasblogs.blogspot.com/p/how-to-write-your-own-malloc-and-free.html