Cara Kerja malloc
Heap dan daftar memori bebas.
Cara Kerja malloc adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.
Apa yang Sebenarnya Dilakukan malloc
Saat Anda memanggil malloc(n), pustaka C memberikan penunjuk ke setidaknya n byte yang dapat digunakan. Namun, heap hanyalah wilayah memori proses yang dikelola oleh pengalokasi untuk Anda.
Tugas pengalokasi adalah pencatatan: melacak byte mana yang sedang digunakan, mana yang bebas, dan cara menggunakan kembali memori yang dibebaskan secara efisien.
Heap Berasal dari OS
Pengalokasi tidak menciptakan memori dari ketiadaan. Pengalokasi meminta potongan besar kepada sistem operasi melalui pemanggilan sistem seperti brk/sbrk atau mmap.
Kemudian, pengalokasi membagi potongan tersebut menjadi block yang lebih kecil untuk pemanggilan malloc Anda. Meminta memori kepada OS mahal, sehingga pengalokasi meminta memori dalam jumlah besar dan mendaur ulangnya.
/* Conceptual: grow the heap by 4096 bytes */
void *base = sbrk(4096);
if (base == (void *)-1) {
/* out of memory */
}sbrk dan Batas Program
sbrk(n) memindahkan "batas program" naik sebesar n byte dan mengembalikan batas sebelumnya. Wilayah yang baru terbuka itu menjadi ruang heap yang tersedia.
Cara ini linear dan sederhana, tetapi sulit mengembalikan memori di bagian tengah. Pengalokasi modern lebih memilih mmap untuk permintaan besar.
void *prev_break = sbrk(0); /* current break */
sbrk(1024); /* grow by 1 KB */
/* prev_break now points to fresh memory */Metadata Block
Untuk setiap alokasi, pengalokasi menyimpan header kecil di sebelah data: ukurannya dan apakah block tersebut bebas. Header ini memungkinkan free bekerja hanya dengan penunjuk data yang Anda berikan kembali.
Penunjuk yang Anda terima dari malloc menunjuk setelah header, sehingga metadata tetap tersembunyi dari Anda.
typedef struct block {
size_t size;
int free;
struct block *next;
} block_t;Penunjuk Tepat Setelah Header
Trik yang umum digunakan adalah aritmetika penunjuk: penunjuk pengguna adalah header + 1. Jika diberikan penunjuk pengguna, header berada satu block_t sebelum penunjuk tersebut.
Dengan cara inilah free(p) mendapatkan kembali ukuran block yang Anda alokasikan tanpa Anda perlu memberikannya secara terpisah.
block_t *hdr = (block_t *)user_ptr - 1;
printf("block size = %zu\n", hdr->size);Demo Tata Letak Header Sederhana
Mari kita letakkan header di atas buffer statis lalu membacanya kembali. Ini menunjukkan cara pengalokasi nyata membagi wilayah menjadi header dan muatan.
Tidak ada pemanggilan OS yang terlibat, sehingga program ini dapat berjalan di mana saja.
#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;
}Gagasan Daftar Bebas
Banyak pengalokasi menghubungkan block bebas ke dalam daftar tertaut. Saat Anda memanggil malloc, pengalokasi menelusuri daftar ini untuk mencari block yang cukup besar.
Saat Anda memanggil free, block ditandai sebagai bebas dan dikembalikan ke daftar untuk digunakan kembali nanti, sehingga tidak perlu meminta lagi kepada OS.
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;
}Tugas yang Harus Dilakukan free
free(p) menemukan header untuk p, menandainya sebagai bebas, dan idealnya menggabungkannya dengan block bebas di sebelahnya (penggabungan) untuk mengurangi fragmentasi.
Memanggil free dua kali pada penunjuk yang sama atau membebaskan penunjuk yang bukan berasal dari heap adalah perilaku tidak terdefinisi karena metadata menjadi rusak.
void my_free(void *p) {
if (!p) return;
block_t *hdr = (block_t *)p - 1;
hdr->free = 1;
/* real allocators coalesce neighbors here */
}Fragmentasi
Seiring waktu, pembebasan dan alokasi dengan ukuran berbeda meninggalkan celah. Fragmentasi eksternal berarti memori bebas tersedia, tetapi tersebar menjadi bagian-bagian yang terlalu kecil untuk memenuhi permintaan.
Fragmentasi internal adalah ruang terbuang di dalam block yang lebih besar daripada kebutuhan, sering kali akibat penyelarasan atau pembulatan.
Persyaratan Penyelarasan
malloc harus mengembalikan memori yang terselaraskan untuk tipe apa pun. Pada sebagian besar sistem 64-bit, ini berarti penyelarasan 16 byte yang memenuhi max_align_t.
Penunjuk yang tidak terselaraskan dapat menyebabkan kegagalan pada beberapa CPU atau memperlambat akses pada CPU lainnya, sehingga pengalokasi selalu membulatkan muatan ke batas penyelarasan.
#include <stdalign.h>
/* alignof(max_align_t) is the strictest required alignment */
size_t a = alignof(max_align_t);Menyatukan Semuanya
Jadi, pengalokasi minimal memerlukan: sumber memori (buffer statis, sbrk, atau mmap), header untuk setiap block, strategi untuk menemukan ruang bebas, dan penanganan penyelarasan.
Dalam pelajaran berikutnya, kita akan membangun bagian-bagian ini: pertama bump allocator, lalu daftar bebas, kemudian penyelarasan dan pemisahan block.
/* The four pillars of a custom allocator */
/* 1. memory source 2. block headers */
/* 3. free-block search 4. alignment */Pemeriksaan Singkat
Uji pemahaman Anda tentang bagian dalam pengalokasi.
Ringkasan
malloc mengelola heap yang diperoleh dari OS melalui sbrk atau mmap, lalu membaginya menjadi block dengan header tersembunyi yang melacak ukuran dan status bebas.
Daftar bebas memungkinkan penggunaan kembali, penyelarasan membuat setiap tipe dapat digunakan dengan benar, dan fragmentasi merupakan tantangan utama. Gagasan-gagasan ini menjadi dasar pengalokasi yang akan kita bangun berikutnya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Cara Kerja malloc” gratis?
Ya — teks lengkap “Cara Kerja malloc” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Cara Kerja malloc”?
Heap dan daftar memori bebas. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C Academy?
Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Cara Kerja malloc” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Cara Kerja malloc
- Alokator Bump Sederhana
- Daftar Memori Bebas dan Penggunaan Ulang
- Penyelarasan dan Pemisahan