https://github.com/kkkooolllyyyaaa/block-memory-allocator
https://github.com/kkkooolllyyyaaa/block-memory-allocator
block-allocator linked-list mmap
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/kkkooolllyyyaaa/block-memory-allocator
- Owner: kkkooolllyyyaaa
- Created: 2022-04-04T18:01:56.000Z (about 3 years ago)
- Default Branch: master
- Last Pushed: 2022-04-04T18:06:52.000Z (about 3 years ago)
- Last Synced: 2025-01-14T04:09:46.901Z (4 months ago)
- Topics: block-allocator, linked-list, mmap
- Language: C
- Homepage:
- Size: 94.7 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Assignment: Memory allocator
---# Аллокатор памяти
- что делать с большим количеством последовательно идущих свободных блоков?
- как избежать появления слишком маленьких блоков?
- что делать, если память в куче кончилась?## Алгоритм `malloc(n)`
- Нет смысла выделять блок размером, скажем, 1 байт; даже его заголовок будет занимать больше места.
Пусть минимальная вместимость блока будет обозначаться так:
```c
#define BLOCK_MIN_CAPACITY 24
```Слишком маленькие блоки могут образовываться в двух случаях:
- `n < BLOCK_MIN_CAPACITY`. Тогда мы будем запрашивать блок не размера `n`, а размера `BLOCK_MIN_CAPACITY`.
- Мы нашли хороший блок, и его размер немногим больше `n`. Если разделить блок на две части, вместимость второй части окажется меньше `BLOCK_MIN_CAPACITY`. Не будем делить такие блоки, а отдадим блок целиком.
- При поиске хорошего блока мы проходимся по блокам кучи. Прежде чем решать, хороший блок или нет, объединим его со всеми идущими за ним свободными блоками.
- Если в куче память кончилась, надо расширить кучу. Для этого будем использовать системный вызов `mmap`. Обязательно прочитайте `man` чтобы понять, с какими аргументами (`prot` и `flags`) его вызывать!
- Сначала надо попытаться выделить память вплотную к концу кучи и разметить её в один большой свободный блок. Если в первом регионе кучи последний блок был свободен, надо объединить его со следующим.
- Если выделить регион вплотную не получилось, то нужно выделить регион "где получится". Последний блок предыдущего региона будет связан с первым блоком нового региона.
## Алгоритм `free(void* addr)`- Помимо уже написанного про `free`, при освобождении блока можно объединить его со всеми следующими за ним свободными блоками.
# Задание
- Реализуйте аллокатор
- Придумайте тесты, показывающие работу аллокатора в важных случаях:
- Обычное успешное выделение памяти.
- Освобождение одного блока из нескольких выделенных.
- Освобождение двух блоков из нескольких выделенных.
- Память закончилась, новый регион памяти расширяет старый.
- Память закончилась, старый регион памяти не расширить из-за другого выделенного диапазона адресов, новый регион выделяется в другом месте.
Тесты должны запускаться из `main.c`, но могут быть описаны в отдельном (отдельных) файлах.
Алгоритм не самый простой, легко ошибиться. Чтобы не тратить времени на отладку, обязательно делайте разбиение на маленькие функции!
- Разберитесь с тем, как написан `Makefile` и исправьте его так, чтобы в итоговый код включался скомпилированный `main.c`. При желании вы можете написать свой `Makefile`, но только если он будет более красив и выразителен.