Arena Allocator Tasarımı: Bellek Parçalanmasını Azaltma

Bellek parçalanması (fragmentation) oyunlar ve gerçek zamanlı sistemlerde performans düşürür. Arena allocator bunu çözer: büyük bir bellek bloğu ayırıp içinden lineer şekilde tahsis yaparsınız. Tüm nesneler bitince bloku sıfırlarsınız. Malloc/free gibi karmaşık kitapçılığa gerek yok.

Sorun şu: dinamik tahsis sık yapıldığında bellek yığını dağılır. Boş alanlar çeşitli yerlere dağılınca yeni blok bulmak zorlaşır, CPU cache miss artar. Arena allocator ise önceden büyük bir bölge ayırır, pointer'ı ileri taşır; tahsis O(1) hızında olur.

Pratik örnek: 1000 oyun nesnesi oluşturup siliyorsunuz. Normal malloc/free ile sistem belleği aramaya gider. Arena'da hepsi yan yana tutulur, cache verimli çalışır.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1#include <cstring>
2#include <cstdlib>
3
4struct Arena {
5char* buffer;
6size_t capacity;
7size_t offset;
8};
9
10Arena arena_create(size_t size) {
11return {(char*)malloc(size), size, 0};
12}
13
14void* arena_alloc(Arena* arena, size_t size) {
15if (arena->offset + size > arena->capacity) {
16return nullptr; // bellek bitti
17}
18void* ptr = arena->buffer + arena->offset;
19arena->offset += size;
20return ptr;
21}
22
23void arena_reset(Arena* arena) {
24arena->offset = 0;
25}
26
27void arena_destroy(Arena* arena) {
28free(arena->buffer);
29arena->buffer = nullptr;
30}
31
32struct Entity {
33int x, y;
34char name[32];
35};
36
37int main() {
38Arena arena = arena_create(1024 * 100); // 100 KB
39
40// 100 entity tahsis et
41Entity* entities = (Entity*)arena_alloc(&arena, 100 * sizeof(Entity));
42
43for (int i = 0; i < 100; i++) {
44entities[i].x = i * 10;
45entities[i].y = i * 20;
46snprintf(entities[i].name, 32, "Entity_%d", i);
47}
48
49printf("100 entity tahsis edildi. Offset: %zu\n", arena.offset);
50
51// Oyun döngüsü sonu: tümünü sıfırla
52arena_reset(&arena);
53printf("Arena sıfırlandı. Offset: %zu\n", arena.offset);
54
55arena_destroy(&arena);
56return 0;
57}

Beklenen çıktı:

1100 entity tahsis edildi. Offset: 6400
2Arena sıfırlandı. Offset: 0

Sık yapılan hata: arena'dan tahsis ettiğiniz belleği manuel free etmeye çalışmak. Arena allocator'ın amacı bu değildir; reset() çağrıncaya kadar bellek tutulur. Eğer ortasında bir nesneyi silmeniz gerekiyorsa, arena allocator uygun değildir, o durumda pool allocator ya da bellek havuzu (memory pool) kullanın.

Arena allocator oyun motorlarında (özellikle frame başında nesne oluşturup frame sonunda temizlemek için) ve veri işleme batch işlemlerinde ideal çözümdür. Bellek süreci tahmin edilebilir, cache-friendly ve hızlı olur.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz