🧠 Bagaimana Program Go Mengakses RAM

Penjelasan lengkap dari kode aplikasi sampai hardware RAM

ðŸ“ą 1. Kode Aplikasi Go (User Space)
Kode yang kamu tulis dalam Go. Ketika kamu membuat variabel atau alokasi memory dengan make(), new(), atau literal, kamu bekerja dengan alamat virtual.
package main func main() { // Alokasi 1MB memory data := make([]byte, 1024*1024) data[0] = 42 // Tulis ke memory }

Stack

Variabel lokal, parameter fungsi. Setiap goroutine punya stack sendiri (mulai 2KB, bisa grow)

Heap

Memory dinamis yang dialokasikan saat runtime. Dikelola oleh Go GC

Virtual Address

Program melihat address space 0x0 - 0xFFFFFFFF (32-bit) atau lebih besar (64-bit)

↓
⚙ïļ 2. Go Runtime (User Space)
Runtime Go adalah layer antara kode kamu dan OS. Dia mengatur memory allocation, garbage collection, dan goroutine scheduling.

Memory Allocator

Mengatur alokasi memory efisien dengan size-segregated pools. Small object (<32KB) dari mcache, large object langsung dari OS

Garbage Collector

Concurrent mark-and-sweep GC. Scan, mark object yang masih dipakai, sweep yang tidak terpakai

Memory Arena

Runtime minta memory dari OS dalam chunk besar (spans), lalu bagi-bagi sendiri untuk efisiensi

↓
🔌 3. System Calls
Interface antara user space dan kernel. Runtime Go pakai syscall seperti mmap(), brk(), madvise() untuk minta/kelola memory dari OS.

mmap()

Map memory ke address space. Bisa untuk anonymous memory atau memory-mapped files

brk() / sbrk()

Perluas heap program (legacy, Go lebih suka mmap)

madvise()

Kasih hint ke kernel tentang pola akses memory untuk optimasi

↓
ðŸ›Ąïļ 4. Kernel / OS (Kernel Space)
Kernel adalah "manager" semua resource termasuk memory. Dia mengatur page table, handle page fault, swap, dan proteksi memory.

Page Table

Data struktur yang map virtual address ke physical address. Setiap proses punya page table sendiri

Page Fault Handler

Ketika program akses page yang belum dimapping, kernel allocate physical page dan update page table

Swap Manager

Ketika RAM penuh, kernel bisa swap out page yang jarang dipakai ke disk untuk free up memory

↓
🔀 5. MMU (Memory Management Unit)
Hardware di CPU yang translate virtual address ke physical address secara otomatis dan sangat cepat. Menggunakan TLB (Translation Lookaside Buffer) untuk cache translation.

Address Translation

Virtual addr 0x12340000 → Physical addr 0x8A3F000. Prosesnya: virtual page number → lookup page table → physical frame number

TLB Cache

Cache kecil dan super cepat di CPU yang simpan recent translations. TLB hit = sangat cepat, TLB miss = harus walk page table

Protection Check

Setiap page punya permission (R/W/X). MMU check permission saat translate, jika invalid → page fault exception

↓
🔧 6. Physical RAM (Hardware)
Chip DRAM fisik yang terpasang di motherboard. Inilah 8GB RAM yang kamu lihat di spesifikasi. Data disimpan dalam kapasitor yang harus di-refresh berkala.

Physical Address Space

8GB = 0x00000000 sampai 0x1FFFFFFFF. Setiap byte punya alamat unik dan dapat diakses

DRAM Cells

Setiap bit disimpan dalam kapasitor kecil. 1 = charged, 0 = discharged. Perlu refresh setiap ~64ms

Memory Controller

Hardware yang handle baca/tulis ke DRAM chips. Di modern CPU, integrated di dalam CPU (IMC)

🔄 Alur Lengkap: data[0] = 42

1
Kode Go Dieksekusi
CPU menjalankan instruksi machine code hasil compile: MOV [0x12340000], 42. Instruksi ini mau tulis nilai 42 ke alamat virtual 0x12340000.
2
MMU Mencoba Translate
MMU cek TLB cache untuk alamat 0x12340000. Jika TLB miss, MMU walk page table yang ada di RAM untuk cari mapping.
3
Page Fault! (Jika Page Belum Mapped)
Jika page belum dimapping ke physical memory, MMU trigger page fault exception. CPU stop eksekusi dan jump ke kernel page fault handler.
4
Kernel Allocate Physical Page
Kernel cari physical page yang free (misal: 0x8A3F000). Jika RAM penuh, kernel mungkin perlu swap out page lain dulu. Update page table: virtual 0x12340000 → physical 0x8A3F000.
5
Kernel Return ke User Space
Kernel selesai handle page fault, return control ke program. CPU retry instruksi yang tadi gagal.
6
MMU Translate Berhasil
Kali ini MMU berhasil translate 0x12340000 → 0x8A3F000 karena mapping sudah ada di page table. Translation disimpan di TLB untuk akses cepat kedepannya.
7
CPU Tulis ke Physical RAM
CPU kirim perintah write ke memory controller dengan alamat fisik 0x8A3F000 dan data 42. Memory controller tulis nilai tersebut ke DRAM chip. Selesai! Proses ini terjadi dalam nanoseconds.

ðŸŽŪ Interactive Demo: Simulasi Memory Access

Klik tombol untuk simulasi proses alokasi memory dan akses data!

ðŸ’Ą Konsep Penting yang Perlu Diingat

💭
Virtual Memory adalah Ilusi
Setiap program merasa punya seluruh address space untuk dirinya sendiri. Program A bisa punya alamat virtual 0x12340000, Program B juga bisa punya alamat virtual yang sama, tapi mereka map ke physical address yang berbeda. Ini memberikan isolasi dan keamanan.
⚡
Lazy Allocation
Ketika kamu make([]byte, 1GB), OS tidak langsung allocate 1GB physical RAM! OS hanya reserve virtual address space. Physical pages baru dialokasikan ketika kamu benar-benar akses memory tersebut (on-demand paging).
📄
Page adalah Unit Dasar
Memory management bekerja dalam unit pages (biasanya 4KB). Meskipun kamu hanya tulis 1 byte, seluruh page (4KB) akan dialokasikan. Ini trade-off antara granularity dan overhead management.
🚀
TLB adalah Kunci Kecepatan
Tanpa TLB, setiap memory access perlu lookup page table di RAM (lambat!). TLB cache recent translations di CPU, membuat translation hampir gratis. TLB hit rate biasanya >99% di aplikasi normal.
ðŸ’ū
Swap Menyelamatkan RAM
Ketika RAM penuh, kernel bisa "meminjam" ruang disk sebagai extended memory dengan swap. Page yang jarang dipakai di-swap out ke disk. Ini memungkinkan total memory usage melebihi physical RAM, tapi dengan cost: disk jauh lebih lambat dari RAM (1000x lebih lambat).
🗚ïļ
mmap untuk File Besar
Dengan mmap, kamu bisa "map" file besar (misal 10GB) ke memory tanpa load semuanya ke RAM. OS load pages on-demand saat diakses, dan bisa evict pages kapan saja karena data tetap ada di disk. Sangat efisien untuk file besar!

📊 Perbandingan Memory Access Latency

CPU Register ~0.5 ns
L1 Cache ~1 ns
L2 Cache ~4 ns
L3 Cache ~20 ns
RAM (Main Memory) ~100 ns
SSD ~100,000 ns (100 Ξs)
HDD (Hard Disk) ~10,000,000 ns (10 ms)

ðŸ’Ą Perhatikan: HDD 100,000x lebih lambat dari RAM! Inilah kenapa swap ke HDD sangat terasa lambat.