Как назначение в операционных системах, мы должны написать собственный код для 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.
Предположим, что мы имеем непрерывный блок памяти определенного размера. Это будет наше абстрактное чувство памяти, которое будет нести все запрошенные распределения памяти и структуры данных, которые используются для хранения данных об этих выделенных блоках.
Мы используем простой связанный список для переноса данных, связанных с выделенными, а также свободными блоками памяти.
Его структура такова.
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*/ };
Для этого вам понадобятся 2 исходных файла. Одним из них является mymalloc.h, который является файлом заголовка, который содержит части инициализации и прототипы функций остальных функций, которые мы собираемся реализовать. Другой – исходный файл mymalloc.c, который содержит все необходимые функции.
Должна быть функция для инициализации первого блока свободной памяти. И еще одна функция, чтобы разделить блок памяти, который имеет более чем достаточно места для предоставления требуемого размера. И еще один способ сканирования через связанный список и слияние любых последовательных блоков, которые являются свободными, чтобы предотвратить внешнюю fragmentацию.
Примечание. Мы используем алгоритм First-fit, чтобы найти свободный блок для выделения памяти.
Я думаю, что это поможет любому, кто ищет простой способ написать свои собственные malloc и бесплатные функции, используя C. Пожалуйста, следуйте следующей ссылке, чтобы получить подробное объяснение.
http://tharikasblogs.blogspot.com/p/how-to-write-your-own-malloc-and-free.html