Apa itu alamat virtual?
Alamat virtual (virtual address) adalah sebuah angka biner dalam memori virtual yang memungkinkan sebuah proses menggunakan suatu lokasi di penyimpanan utama (memori utama) atau, dalam beberapa kasus, di penyimpanan sekunder. Memori virtual mengabstraksi memori fisik dengan menyediakan setiap proses satu set alamat virtual yang memungkinkannya menggunakan blok memori fisik secara independen dari proses lain.
Cara paling simpel untuk memahami alamat virtual adalah sebagai penunjuk ke alamat fisik, yaitu lokasi spesifik dalam penyimpanan utama atau sekunder. Alamat fisik biasanya berada di perangkat penyimpanan utama seperti dynamic random access memory (DRAM), tapi juga bisa di perangkat penyimpanan sekunder seperti solid-state drive (SSD) atau hard disk drive (HDD). Karena alamat virtual bisa menunjuk ke penyimpanan sekunder, data bisa dipindahkan sementara ke perangkat itu saat proses butuh ruang lebih besar dari yang tersedia di memori utama.
Manajemen memori dan alamat virtual
Ketika sebuah proses dijalankan di komputer, sistem operasi (OS) akan memberikan satu set alamat virtual ke proses tersebut untuk menyediakan memori yang dibutuhkannya untuk melakukan operasi. Set alamat ini disebut sebagai *virtual address space* milik proses. Ruang alamat ini bersifat privat dan tidak bisa diakses oleh proses lain kecuali jika telah dibagikan secara eksplisit.
Untuk mendukung alokasi memori, OS akan membagi memori komputer menjadi halaman dengan ukuran tetap—biasanya 4 kilobyte (KB)—dan menetapkan alamat fisik untuk masing-masing. OS juga menyimpan tabel halaman (*page table*) untuk tiap proses yang memetakan alamat virtual ke alamat fisik. Semua operasi baca/tulis ke memori hanya menggunakan alamat virtual; mereka nggak tahu-menahu tentang alamat fisik.
Unit manajemen memori prosesor (MMU) menyimpan tabel halaman dan menangani semua operasi translasi antara alamat virtual dan fisik. MMU adalah komponen perangkat keras dalam unit pemrosesan pusat (CPU) yang mengatur semua memori dan operasi caching. MMU bisa terintegrasi langsung dalam prosesor atau dipasang sebagai sirkuit terintegrasi terpisah.
MMU mengalokasikan memori untuk proses tertentu, menerjemahkan alamat untuk proses itu, dan membebaskan memori saat sudah nggak dibutuhkan lagi. Translasi ini tidak terlihat oleh proses yang berjalan, sehingga proses merasa seolah-olah punya seluruh memori utama sendiri. Selain itu, MMU juga mencakup translation lookaside buffer (TLB), yang menyimpan hasil translasi terakhir untuk mempercepat akses ke memori.
Translasi alamat virtual
Alamat virtual terdiri dari dua bagian: nomor halaman virtual dan *offset* halaman. OS menetapkan nomor halaman untuk memori virtual, menciptakan halaman-halaman virtual. Nomor halaman virtual menunjuk ke nomor halaman fisik di dalam tabel halaman seperti yang ditunjukkan dalam gambar di bawah. Offset halaman tidak termasuk dalam tabel karena nilainya sama di alamat virtual dan alamat fisik, jadi nggak perlu diterjemahkan. Offset ini jadi penunjuk lokasi byte tertentu dalam halaman yang dirujuk.
Gambar menunjukkan gambaran sederhana seperti apa translasi alamat virtual di sistem 32-bit. Dalam contoh ini, alamat virtual punya nilai heksadesimal 0x7F3E5234, yang setara dengan nilai biner: 0111 1111 0011 1110 0101 0010 0011 0100.
Kalau dibaca dari kanan ke kiri, 12 bit pertama (0010 0011 0100) adalah offset halaman, sedangkan 20 bit sisanya (0111 1111 0011 1110 0101) merupakan nomor halaman virtual. Offset 12-bit digunakan karena diperlukan untuk menjangkau semua lokasi di dalam halaman 4 KB—yang butuh 12 bit untuk mengakses seluruh posisi dalam halaman tersebut.
Kedua bagian ini total 32 bit. Alamat ukuran ini bisa mendukung hingga 1.048.576 nomor halaman virtual, dari biner 0000 0000 0000 0000 0000 sampai 1111 1111 1111 1111 1111, atau dalam heksadesimal dari 0x00000 sampai 0xFFFFF.
MMU menggunakan tabel halaman untuk memetakan nomor halaman virtual ke nomor halaman fisik. Dalam contoh ini, nomor halaman fisik punya nilai biner 0110 1101 0000 1000 atau nilai heksadesimal 6D08. Jadi alamat fisik keseluruhan dalam heksadesimal adalah 6D08234, atau biner: 0110 1101 0000 1000 0010 0011 0100.
Setiap nomor halaman fisik di sistem ini menggunakan 16 bit, jadi total alamat fisiknya hanya 28 bit, kalau digabung dengan offset 12-bit. Offset ini sama dengan yang ada di alamat virtual, jadi nggak perlu diterjemahkan ulang.
Nomor halaman fisik 16-bit hanya bisa mendukung 65.536 alamat fisik, jumlah yang jauh lebih sedikit dibandingkan alamat virtual 20-bit. Di sinilah memori virtual berguna—karena memungkinkan OS memberikan sumber daya memori lebih banyak ke proses daripada jumlah memori utama yang tersedia. OS mengatur perbedaan ini di belakang layar, misalnya dengan menunda pemuatan bagian aplikasi atau menukar file ke penyimpanan sekunder, makanya tabel halaman juga bisa menunjuk ke alamat fisik di penyimpanan sekunder.