Как написать простую функцию malloc в c - PullRequest
2 голосов
/ 07 февраля 2012

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

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

, куда пойдет код для инициализации пространства памяти и списков..

Ответы [ 7 ]

1 голос
/ 07 февраля 2012

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

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

Может быть это также хорошо читается.

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

1 голос
/ 07 февраля 2012

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

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

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

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

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

1 голос
/ 07 февраля 2012

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

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

0 голосов
/ 01 марта 2015

Я предоставлю вам базовую концепцию, которую вы можете использовать для написания собственного кода для функций 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*/
   }; 

Для этого вам понадобятся 2 исходных файла.Одним из них является mymalloc.h, который является заголовочным файлом, который содержит части инициализации и прототипы функций остальных функций, которые мы собираемся реализовать.Другой - это исходный файл mymalloc.c, который содержит все необходимые реализации функций.

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

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

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

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

0 голосов
/ 06 февраля 2014

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

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

man sbrk поможет вам.

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

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

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

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

0 голосов
/ 07 февраля 2012

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

0 голосов
/ 07 февраля 2012

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

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

но это "обман". Вы хотите сделать malloc, что полезно.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...