0Pricing
C Academy · Ders

malloc Nasıl Çalışır

Yığın ve boş listeleri.

malloc Nasıl Çalışır, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

malloc Gerçekte Ne Yapar?

malloc(n) çağrısı yaptığınızda C kütüphanesi size en az n kullanılabilir bayta işaret eden bir işaretçi verir. Ancak yığın, ayırıcının sizin adınıza yönettiği bir işlem belleği bölgesinden ibarettir.

Ayırıcının görevi kayıt tutmaktır: hangi baytların kullanımda, hangilerinin boş olduğunu izlemek ve serbest bırakılmış belleği verimli biçimde yeniden kullanmaktır.

Yığın OS'den Gelir

Ayırıcı belleği yoktan var etmez. brk/sbrk veya mmap gibi sistem çağrıları aracılığıyla işletim sisteminden büyük parçalar ister.

Ardından bu parçaları malloc çağrılarınız için daha küçük bloklara böler. İşletim sisteminden istemek maliyetlidir; bu nedenle ayırıcılar belleği toplu olarak ister ve yeniden kullanır.

/* Conceptual: grow the heap by 4096 bytes */
void *base = sbrk(4096);
if (base == (void *)-1) {
    /* out of memory */
}

sbrk ve Program Sonu

sbrk(n), "program sonu"nu n bayt ileri taşır ve önceki sonu döndürür. Yeni erişilebilir hâle gelen bölge, kullanılabilir yığın alanı olur.

Bu yöntem doğrusal ve basittir, ancak belleği ortadan kolayca geri veremez. Modern ayırıcılar büyük istekler için mmap kullanmayı tercih eder.

void *prev_break = sbrk(0);   /* current break */
sbrk(1024);                   /* grow by 1 KB */
/* prev_break now points to fresh memory */

Blok Üstverileri

Ayırıcı, her bellek ayırma işlemi için verinin yanında küçük bir başlık saklar: bloğun boyutu ve boş olup olmadığı. Bu başlık, free işlevinin yalnızca geri verdiğiniz veri işaretçisiyle çalışmasını sağlar.

malloc tarafından size verilen işaretçi başlığın sonrasını gösterir; böylece üstveriler sizden gizli kalır.

typedef struct block {
    size_t size;
    int free;
    struct block *next;
} block_t;

Başlığın Hemen Ardındaki İşaretçi

Yaygın bir yöntem işaretçi aritmetiğidir: kullanıcı işaretçisi header + 1 olur. Kullanıcı işaretçisinden, başlık ondan bir block_t öncesindedir.

free(p), siz ayrıca vermeden ayırdığınız bloğun boyutunu bu şekilde bulur.

block_t *hdr = (block_t *)user_ptr - 1;
printf("block size = %zu\n", hdr->size);

Küçük Bir Başlık Yerleşimi Gösterimi

Statik bir arabelleğin üzerine bir başlık yerleştirip onu geri okuyalım. Bu, gerçek bir ayırıcının bir bölgeyi başlık ve veri alanı olarak nasıl böldüğünü gösterir.

Herhangi bir OS çağrısı kullanılmadığından her yerde çalışır.

#include <stdio.h>
#include <stddef.h>

typedef struct { size_t size; int free; } block_t;
static char buffer[256];

int main(void) {
    block_t *h = (block_t *)buffer;
    h->size = 64;
    h->free = 0;
    void *payload = (char *)buffer + sizeof(block_t);
    printf("header bytes = %zu\n", sizeof(block_t));
    printf("payload offset = %ld\n", (long)((char *)payload - buffer));
    printf("size field = %zu\n", h->size);
    return 0;
}

Serbest Liste Fikri

Birçok ayırıcı, boş blokları bağlı bir listede birbirine bağlar. malloc çağrısı yaptığınızda ayırıcı, yeterince büyük bir blok aramak için bu listeyi tarar.

free çağrısı yaptığınızda blok boş olarak işaretlenir ve daha sonra yeniden kullanılmak üzere listeye döndürülür; böylece başka bir OS isteği önlenir.

block_t *find_free(block_t *head, size_t size) {
    block_t *b = head;
    while (b && !(b->free && b->size >= size))
        b = b->next;
    return b;
}

free Ne Yapmalıdır?

free(p), p için başlığı bulur, onu boş olarak işaretler ve parçalanmayı azaltmak için ideal olarak bitişik boş bloklarla birleştirir.

Aynı işaretçi üzerinde iki kez free çağırmak veya yığın dışı bir işaretçiyi serbest bırakmak tanımsız davranıştır; çünkü üstveriler bozulur.

void my_free(void *p) {
    if (!p) return;
    block_t *hdr = (block_t *)p - 1;
    hdr->free = 1;
    /* real allocators coalesce neighbors here */
}

Parçalanma

Zamanla farklı boyutlarda bellek serbest bırakıp ayırmak aralarda boşluklar bırakır. Dış parçalanma, boş bellek bulunmasına rağmen bu belleğin bir isteği karşılayamayacak kadar küçük parçalara dağılmış olmasıdır.

İç parçalanma ise çoğunlukla hizalama veya yuvarlama nedeniyle gerekenden büyük bir blok içindeki alanın boşa harcanmasıdır.

Hizalama Gereksinimleri

malloc, her tür için uygun şekilde hizalanmış bellek döndürmelidir. Çoğu 64 bit sistemde bu, max_align_t gereksinimini karşılayan 16 baytlık hizalama anlamına gelir.

Hizalanmamış işaretçiler bazı işlemcilerde çökmeye, bazılarında ise erişimin yavaşlamasına neden olabilir; bu nedenle ayırıcılar veri alanlarını her zaman bir hizalama sınırına yuvarlar.

#include <stdalign.h>
/* alignof(max_align_t) is the strictest required alignment */
size_t a = alignof(max_align_t);

Hepsini Bir Araya Getirme

Bu nedenle en temel ayırıcının şunlara ihtiyacı vardır: bir bellek kaynağı (statik arabellek, sbrk veya mmap), blok başlıkları, boş alan bulma stratejisi ve hizalama işlemesi.

Sonraki derslerde bu parçaları oluşturacağız: önce bir bump allocator, ardından serbest listeler, sonra da hizalama ve blok bölme.

/* The four pillars of a custom allocator */
/* 1. memory source   2. block headers */
/* 3. free-block search   4. alignment */

Kısa Kontrol

Ayırıcıların iç işleyişini anlayıp anlamadığınızı sınayınız.

Özet

malloc, sbrk veya mmap aracılığıyla OS'den alınan bir yığını yönetir ve bu yığını boyut ile boşluk durumunu izleyen gizli başlıklara sahip bloklara böler.

Serbest listeler yeniden kullanımı mümkün kılar, hizalama her türün gereksinimini karşılar ve parçalanma temel zorluktur. Bir sonraki derste oluşturacağımız ayırıcının temelini bu fikirler oluşturur.

Sıkça Sorulan Sorular

“malloc Nasıl Çalışır” dersi ücretsiz mi?

Evet — “malloc Nasıl Çalışır” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“malloc Nasıl Çalışır” dersinde ne öğreneceğim?

Yığın ve boş listeleri. C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“malloc Nasıl Çalışır” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. malloc Nasıl Çalışır
  2. Basit Bir Artırmalı Ayırıcı
  3. Boş Listeler ve Yeniden Kullanım
  4. Hizalama ve Bölme
← C Academy Sayfasına Dön