Bagaimana Program Mengakses RAM

1. RAM Fisik (Physical Memory)

RAM 8GB yang kamu lihat itu adalah memori fisik yang terpasang di motherboard. Ini adalah chip hardware yang menyimpan data dalam bentuk bit (0 dan 1).

  • Alamat fisik: 0x00000000 sampai 0x1FFFFFFFF (untuk 8GB)

  • Setiap byte punya alamat unik

  • TAPI, program kamu TIDAK pernah akses RAM fisik secara langsung! Ini penting!

2. Virtual Memory (Memori Virtual)

Setiap program/proses mendapat ilusi bahwa mereka punya seluruh memori untuk diri mereka sendiri. Ini disebut virtual memory.

Kenapa perlu virtual memory?

  • Isolasi: Program A tidak bisa akses memori Program B (keamanan)

  • Simplifikasi: Program tidak perlu tahu di mana posisi fisik RAM-nya

  • Overcommitment: Total virtual memory semua program bisa lebih dari 8GB fisik

3. MMU (Memory Management Unit)

MMU adalah chip hardware (bagian dari CPU) yang mentranslasi alamat virtual ke alamat fisik.

Cara kerja:

Program: "Saya mau akses alamat 0x400000"
         ↓
MMU: "OK, alamat virtual 0x400000 itu sebenarnya ada di RAM fisik 0x8A3F000"
         ↓
RAM: Memberikan data dari alamat fisik tersebut

Page Table

MMU menggunakan Page Table (tabel halaman) untuk mapping:

  • Memori dibagi jadi chunk bernama pages (biasanya 4KB)

  • Page Table menyimpan mapping: Virtual Page β†’ Physical Page

  • Disimpan di RAM, dikelola oleh OS kernel

4. Peran Kernel/OS

Kernel Linux/Windows adalah "manager" dari semua memori. Tugasnya:

a) Memory Allocation

Ketika program minta memori (malloc/new), kernel:

  1. Cari physical page yang kosong

  2. Update page table proses tersebut

  3. Return alamat virtual ke program

b) Page Fault Handling

Kalau program akses alamat yang belum dimapping:

c) Memory Protection

Setiap page punya permission (read/write/execute). Kalau program coba akses yang tidak diizinkan β†’ segmentation fault!

5. SWAP (Swap Space)

Ketika RAM fisik penuh, kernel bisa "mengusir" page yang jarang dipakai ke disk (swap).

Proses:

Kalau program akses page yang di-swap:

Swap itu LAMBAT karena disk jauh lebih lambat dari RAM (HDD: ~100 MB/s vs RAM: ~25 GB/s)

6. mmap (Memory Mapped Files)

mmap adalah syscall yang "memetakan" file ke memory address space program.

Contoh:

Yang terjadi di belakang layar:

Keuntungan mmap:

  • Efficient: hanya load yang diakses

  • Shared memory: beberapa proses bisa mmap file yang sama

  • OS bisa cache-kan di page cache

7. Go Runtime Memory Management

Go punya memory allocator sendiri di atas syscall OS:

a) Memory Arena

Go runtime minta memory dari OS dalam chunk besar (biasanya beberapa MB):

b) Go Allocator

Runtime Go punya allocator yang efisien:

  • Small objects (<32KB): dialokasikan dari memory pool per-size

  • Large objects (β‰₯32KB): langsung dari OS

  • Stack: setiap goroutine punya stack (mulai 2KB, bisa grow)

c) Garbage Collector

GC Go secara periodik:

  1. Scan semua pointer yang masih dipakai

  2. Tandai object yang masih "hidup"

  3. Bebaskan memory object yang mati

  4. Tidak langsung return ke OS, disimpan di free list untuk reuse

8. Dari Kode Go ke RAM

Mari trace alur lengkap dari kode Go:

Yang terjadi:

9. Visualisasi Lengkap

Sempurna! Saya sudah melengkapi visualisasi interaktifnya. Sekarang mari saya tambahkan beberapa penjelasan tambahan yang penting:

10. Copy-on-Write (COW)

Ada mekanisme penting lain yang perlu kamu tahu:

Ketika proses fork (duplikasi proses), tidak semua memory langsung di-copy! Kernel menggunakan Copy-on-Write:

Ini menghemat memory dan waktu saat fork!

11. Huge Pages / Large Pages

Normalnya page size = 4KB, tapi modern CPU support huge pages:

  • x86-64: 2MB atau 1GB pages

  • Keuntungan: Lebih sedikit entries di page table, lebih sedikit TLB miss

  • Go bisa pakai: Transparent Huge Pages (THP) di Linux

12. NUMA (Non-Uniform Memory Access)

Di server dengan multiple CPU socket, RAM tidak "seragam":

Akses RAM "lokal" lebih cepat dari RAM "remote". Kernel coba allocate memory dari RAM bank terdekat ke CPU yang eksekusi process.

13. Kenapa Perlu Virtual Memory?

Tanpa virtual memory, masalah besar:

  1. Fragmentasi: Program perlu continuous physical memory (susah!)

  2. Security: Program bisa akses memory program lain (bahaya!)

  3. Relocation: Program harus load di alamat fisik yang sama setiap run

  4. Limited address space: Terbatas physical RAM saja

Dengan virtual memory, semua masalah solved!

Last updated