Ruang alamat adalah kumpulan alamat yang dapat digunakan oleh suatu proses untuk
mengalamati memori. Setiap proses memiliki ruang alamatnya sendiri, tidak tergantung pada
proses lainnya (kecuali dalam beberapa keadaan khusus di mana proses ingin berbagi ruang
alamatnya). Dua masalah harus dipecahkan untuk memungkinkan beberapa aplikasi berada di
memori pada saat yang sama tanpa mengganggu satu sama lain: perlindungan dan relokasi.
Kami melihat solusi primitif untuk solusi pertama yang digunakan pada IBM 360: memberi
label potongan memori dengan kunci perlindungan dan membandingkan kunci proses
eksekusi dengan kunci setiap kata memori yang diambil.
Konsep ruang alamat sangat umum dan terjadi dalam banyak konteks. Pertimbangkan
nomor telepon. Di Amerika Serikat dan banyak negara lain, nomor telepon lokal biasanya
berupa nomor 7 digit. Ruang alamat untuk nomor telepon dengan demikian berjalan dari
0.000.000 hingga 9.999.999, meskipun beberapa nomor, seperti yang dimulai dengan 000
tidak digunakan. Dengan pertumbuhan smartphone, modem, dan mesin faks, ruang ini
menjadi terlalu kecil, dalam hal ini lebih banyak digit harus digunakan.
Solusi sederhana ini menggunakan versi yang sangat sederhana dari relokasi dinamis.
Apa yang dilakukannya adalah memetakan ruang alamat setiap proses ke bagian memori fisik
yang berbeda dengan cara yang sederhana. Solusi klasik, yang digunakan pada mesin mulai
dari CDC 6600 (super komputer pertama di dunia) hingga Intel 8088 (jantung dari IBM PC
asli), adalah melengkapi setiap CPU dengan dua register perangkat keras khusus, biasanya
disebut basis dan membatasi mendaftar.
Setiap kali suatu proses mereferensikan memori, baik untuk mengambil instruksi atau
membaca atau menulis kata data, perangkat keras CPU secara otomatis menambahkan nilai
dasar ke alamat yang dihasilkan oleh proses sebelum mengirim alamat keluar pada bus
memori. Secara bersamaan, ia memeriksa apakah alamat yang ditawarkan sama dengan atau
lebih besar dari nilai dalam register batas, dalam hal ini kesalahan dihasilkan dan akses
dibatalkan.
3.2.2 Swapping
Jika memori fisik komputer cukup besar untuk menampung semua proses, skema
yang dijelaskan sejauh ini kurang lebih bisa. Namun dalam praktiknya, jumlah total RAM
yang dibutuhkan oleh semua proses seringkali jauh lebih banyak daripada yang dapat
ditampung dalam memori. Pada sistem Windows, OS X, atau Linux biasa, kira-kira 50–100
proses atau lebih dapat dimulai segera setelah komputer di-boot.
Dua pendekatan umum untuk menangani kelebihan memori telah dikembangkan selama
bertahun-tahun. Strategi paling sederhana, disebut bertukar, terdiri dari memasukkan setiap
proses secara keseluruhan, menjalankannya sebentar, lalu meletakkannya kembali di disk.
Pengoperasian sistem swapping diilustrasikan pada Gambar 3-4. Awalnya, hanya proses
sebuah ada di memori. Kemudian proses B dan Cdibuat atau ditukar dari disk.
Saat swapping menciptakan banyak lubang di memori, dimungkinkan untuk menggabungkan
semuanya menjadi satu lubang besar dengan memindahkan semua proses ke bawah sejauh
mungkin. Teknik ini dikenal sebagaipemadatan memori. Namun, jika segmen data proses
dapat tumbuh, misalnya, dengan mengalokasikan memori secara dinamis dari tumpukan,
seperti dalam banyak bahasa pemrograman, masalah terjadi setiap kali proses mencoba untuk
tumbuh.
Jika diharapkan bahwa sebagian besar proses akan tumbuh saat berjalan, mungkin ide
yang baik untuk mengalokasikan sedikit memori ekstra setiap kali suatu proses ditukar atau
dipindahkan, untuk mengurangi overhead yang terkait dengan proses pemindahan atau
pertukaran yang tidak lagi sesuai dengan prosesnya.
Jika proses dapat memiliki dua segmen yang berkembang—misalnya, segmen data yang
digunakan sebagai tumpukan untuk variabel yang dialokasikan dan dirilis secara dinamis dan
segmen tumpukan untuk variabel lokal normal dan alamat pengirim— pengaturan alternatif
menyarankan dirinya sendiri, yaitu dari Gambar 3-5(b).
Dengan bitmap, memori dibagi menjadi unit alokasi sekecil beberapa kata dan sebesar
beberapa kilobyte.
Ukuran unit alokasi merupakan masalah desain yang penting. Semakin kecil unit alokasi,
semakin besar bitmap. Namun, bahkan dengan unit alokasi sekecil 4 byte, memori 32 bit
hanya akan membutuhkan 1 bit peta. Memori 32n bit akan digunakannbit peta, sehingga
bitmap hanya akan memakan 1/32 memori.
Cara lain untuk melacak memori adalah dengan memelihara daftar tertaut dari segmen
memori yang dialokasikan dan bebas, di mana segmen berisi proses atau lubang kosong di
antara dua proses. Memori Gambar 3-6(a) direpresentasikan pada Gambar 3-6(c) sebagai
daftar segmen yang terhubung. Setiap entri dalam daftar menentukan lubang (H) atau proses
(P), alamat di mana itu dimulai, panjangnya, dan penunjuk ke item berikutnya.
Ketika proses dan lubang disimpan pada daftar yang diurutkan berdasarkan alamat, beberapa
algoritma dapat digunakan untuk mengalokasikan memori untuk proses yang dibuat (atau
proses yang ada ditukar dari disk). Kami berasumsi bahwa manajer memori tahu berapa
banyak memori yang harus dialokasikan. Algoritma yang paling sederhana adalah cocok
pertama
Algoritma lain yang terkenal dan banyak digunakan adalahpaling cocok. Paling cocok
mencari seluruh daftar, dari awal sampai akhir, dan mengambil lubang terkecil yang
memadai. Daripada memecah lubang besar yang mungkin diperlukan nanti, best fit mencoba
menemukan lubang yang mendekati ukuran sebenarnya yang dibutuhkan, agar sesuai dengan
permintaan dan lubang yang tersedia. Sebagai contoh kecocokan pertama dan kecocokan
terbaik, perhatikan kembali Gambar 3-6
Jika daftar yang berbeda dipertahankan untuk proses dan lubang, daftar lubang dapat
disimpan diurutkan berdasarkan ukuran, untuk membuatnya lebih cepat sesuai. Ketika best fit
mencari daftar lubang dari yang terkecil sampai yang terbesar, segera setelah menemukan
lubang yang cocok, ia tahu bahwa lubang itu adalah lubang terkecil yang akan melakukan
pekerjaan itu, karenanya yang paling cocok. Tidak diperlukan pencarian lebih lanjut, seperti
halnya dengan skema daftar tunggal. Dengan daftar lubang yang diurutkan berdasarkan
ukuran, kecocokan pertama dan kecocokan terbaik sama cepatnya, dan kecocokan berikutnya
tidak ada gunanya.
Sementara register dasar dan batas dapat digunakan untuk membuat abstraksi ruang
alamat, ada masalah lain yang harus dipecahkan: mengelola bloatware. Sementara ukuran
memori meningkat dengan cepat, ukuran perangkat lunak meningkat jauh lebih cepat. Pada
1980-an, banyak universitas menjalankan sistem pembagian waktu dengan lusinan (kurang
lebih puas) pengguna yang berjalan secara bersamaan pada VAX 4-MB.
Masalah program yang lebih besar dari memori telah ada sejak awal komputasi, meskipun di
area terbatas, seperti sains dan teknik (mensimulasikan penciptaan alam semesta atau bahkan
mensimulasikan pesawat baru membutuhkan banyak memori). Sebuah solusi yang diadopsi
pada tahun 1960-an adalah untuk membagi program menjadi bagian-bagian kecil, yang
3.3.1 Halaman
Contoh yang sangat sederhana tentang cara kerja pemetaan ini ditunjukkan pada Gambar 3-9.
Dalam contoh ini, kami memiliki komputer yang menghasilkan alamat 16-bit, dari 0 hingga
64K 1.
Ruang alamat virtual terdiri dari unit ukuran tetap yang disebut halaman. Unit yang sesuai
dalam memori fisik disebutbingkai halaman. Halaman dan bingkai halaman umumnya
berukuran sama. Dalam contoh ini ukurannya 4 KB, tetapi ukuran halaman dari 512 byte
hingga gigabyte telah digunakan dalam sistem nyata.
Karena alamat virtual 8192 (dalam halaman virtual 2) dipetakan ke 24576 (dalam bingkai
halaman fisik 6). Sebagai contoh ketiga, alamat virtual 20500 adalah 20 byte dari awal
halaman virtual 5 (alamat virtual 20480 hingga 24575) dan dipetakan ke alamat fisik 12288
20 = 12308. Sekarang mari kita lihat ke dalam MMU untuk melihat cara kerjanya dan
mengapa kita memilih untuk menggunakan ukuran halaman yang dipangkatkan 2. Pada
Gambar 3-10 kita melihat contoh alamat virtual, 8196 (0010000000000100 dalam biner) ,
dipetakan menggunakan peta MMU pada Gambar 3-9.
Poin pertama adalah konsekuensi dari kenyataan bahwa pemetaan virtual-ke-fisik harus
dilakukan pada setiap referensi memori. Semua instruksi pada akhirnya harus berasal dari
memori dan banyak dari mereka mereferensikan operan dalam memori juga.
Poin kedua mengikuti fakta bahwa semua komputer modern menggunakan alamat virtual
setidaknya 32 bit, dengan 64 bit menjadi norma untuk desktop dan laptop.
Kebutuhan untuk pemetaan halaman yang besar dan cepat merupakan kendala yang sangat
signifikan dalam cara komputer dibangun. Desain paling sederhana (setidaknya secara
konseptual) adalah memiliki tabel halaman tunggal yang terdiri dari array register perangkat
keras cepat, dengan satu entri untuk setiap halaman virtual, diindeks oleh nomor halaman
virtual, seperti yang ditunjukkan pada Gambar 3-10
Sebagai contoh, pertimbangkan alamat virtual 32-bit 0x00403004 (4.206.596 desimal), yaitu
12.292 byte ke dalam data. Alamat virtual ini sesuai dengan PT1=1,PT2=3, dan
Mengimbangi=4. MMU pertama kali menggunakanPT1untuk mengindeks ke atas tabel
halaman level dan dapatkan entri 1, yang sesuai dengan alamat 4M hingga 8M 1.
3.4 ALGORITMA PENGGANTIAN HALAMAN
Ketika kesalahan halaman terjadi, sistem operasi harus memilih halaman yang akan
dikeluarkan (dihapus dari memori) untuk memberi ruang bagi halaman yang masuk.
Meskipun dimungkinkan untuk memilih halaman acak untuk dihapus pada setiap kesalahan
halaman, kinerja sistem jauh lebih baik jika halaman yang tidak banyak digunakan dipilih.
Algoritme penggantian halaman terbaik mudah untuk dijelaskan tetapi tidak mungkin untuk
benar-benar diterapkan. Ini berjalan seperti ini. Pada saat kesalahan halaman terjadi, beberapa
set halaman ada di memori.
Di bagian sebelumnya kami telah menjelaskan cara kerja paging dan telah memberikan
beberapa algoritme penggantian halaman dasar. Tetapi mengetahui mekanika telanjang saja
tidak cukup.
Jika halaman dengan nilai usia terendah dihapus tanpa memperhatikan halaman siapa itu,
halamanB3akan dipilih dan kita akan mendapatkan situasi Gambar 3-22(c). Secara umum,
algoritme global bekerja lebih baik, terutama ketika ukuran set kerja dapat sangat bervariasi
selama masa proses. Jika algoritme lokal digunakan dan set kerja bertambah, thrashing akan
terjadi, meskipun ada cukup banyak bingkai halaman gratis.
Bahkan dengan algoritme penggantian halaman terbaik dan alokasi global bingkai halaman
yang optimal untuk proses, dapat terjadi bahwa sistem rusak. Faktanya, setiap kali kumpulan
kerja gabungan dari semua proses melebihi kapasitas memori, thrashing dapat diharapkan.
Cara yang baik untuk mengurangi jumlah proses yang bersaing untuk mendapatkan memori adalah
dengan menukar beberapa dari mereka ke disk dan membebaskan semua halaman yang mereka
pegang.
Sebagian besar komputer memiliki ruang alamat tunggal yang menampung program
dan data, seperti ditunjukkan pada Gambar 3-24(a). Salah satu solusi, yang dipelopori pada (16-
bit) PDP-11, adalah memiliki ruang alamat terpisah untuk instruksi (teks program) dan data, yang
disebutruang-akudanruang-D, masing-masing, seperti yang diilustrasikan pada Gambar.
Di komputer dengan desain seperti ini, kedua ruang alamat dapat di-page, secara
independen satu sama lain. Masing-masing memiliki tabel halamannya sendiri, dengan
pemetaan halaman virtualnya sendiri ke bingkai halaman fisik.
3.6 MASALAH IMPLEMENTASI
Pelaksana sistem memori virtual harus membuat pilihan di antara algoritme teoretis
utama, seperti peluang kedua versus penuaan, alokasi halaman lokal versus global, dan
permintaan paging versus pra-halaman.
Ada empat waktu ketika sistem operasi memiliki pekerjaan terkait paging yang harus
dilakukan: waktu pembuatan proses, waktu eksekusi proses, waktu kesalahan halaman, dan
waktu penghentian proses. Ketika proses baru dibuat dalam sistem paging, sistem operasi
harus menentukan seberapa besar program dan data (awalnya) dan membuat tabel halaman
untuk mereka. Ruang harus dialokasikan dalam memori untuk tabel halaman dan harus
diinisialisasi.
Kami akhirnya berada dalam posisi untuk menjelaskan secara rinci apa yang terjadi pada
kesalahan halaman.
2. Rutin kode perakitan dimulai untuk menyimpan register umum dan informasi volatil
lainnya, untuk menjaga sistem operasi agar tidak merusaknya. Rutin ini memanggil sistem
operasi sebagai prosedur.
3. Sistem operasi menemukan bahwa kesalahan halaman telah terjadi, dan mencoba
menemukan halaman virtual mana yang diperlukan. Seringkali salah satu register perangkat
keras berisi informasi ini. Jika tidak, sistem operasi harus mengambil penghitung program,
mengambil instruksi, dan menguraikannya dalam perangkat lunak untuk mencari tahu apa
yang dilakukannya ketika kesalahan terjadi
4. Setelah alamat virtual yang menyebabkan kesalahan diketahui, sistem akan memeriksa
apakah alamat ini valid dan proteksinya konsisten dengan akses. Jika tidak, proses dikirimi
sinyal atau dimatikan. Jika alamatnya valid dan tidak ada kesalahan perlindungan yang
terjadi, sistem akan memeriksa untuk melihat apakah bingkai halaman kosong. Jika tidak ada
frame yang bebas, algoritma penggantian halaman dijalankan untuk memilih korban.
5. Jika bingkai halaman yang dipilih kotor, halaman dijadwalkan untuk ditransfer ke disk, dan
sakelar konteks terjadi, menangguhkan proses kesalahan dan membiarkan yang lain berjalan
sampai transfer disk selesai. Bagaimanapun, bingkai ditandai sebagai sibuk untuk
mencegahnya digunakan untuk tujuan lain.
6. Segera setelah bingkai halaman bersih (baik segera atau setelah ditulis ke disk), sistem
operasi mencari alamat disk di mana halaman yang dibutuhkan berada, dan menjadwalkan
operasi disk untuk membawanyamasuk. sedang dimuat, proses kesalahan masih
ditangguhkan dan proses pengguna lain dijalankan, jika tersedia.
7. Ketika interupsi disk menunjukkan bahwa halaman telah tiba, tabel halaman diperbarui
untuk mencerminkan posisinya, dan bingkai ditandai sebagai dalam keadaan normal.
8. Instruksi kesalahan di-backup ke keadaan saat dimulai dan penghitung program direset
untuk menunjuk ke instruksi tersebut.
9. Proses kesalahan dijadwalkan, dan sistem operasi kembali ke rutinitas (bahasa rakitan)
yang memanggilnya.
10. Rutin ini memuat ulang register dan informasi status lainnya dan kembali ke ruang
pengguna untuk melanjutkan eksekusi, seolah-olah tidak ada kesalahan yang terjadi.
Ketika sebuah program mereferensikan halaman yang tidak ada dalam memori, instruksi
yang menyebabkan kesalahan dihentikan di tengah jalan dan jebakan ke sistem operasi
terjadi. Pada Gambar 3-27, kita memiliki instruksi yang dimulai dari alamat 1000 yang membuat tiga
referensi memori: kata instruksi dan dua offset untuk operan. Tergantung pada mana dari tiga
referensi memori ini yang menyebabkan kesalahan halaman, penghitung program mungkin 1000,
1002, atau 1004 pada saat kesalahan.
Meskipun kita belum banyak membahas I/O dalam bab ini, fakta bahwa komputer memiliki
memori virtual tidak berarti bahwa I/O tidak ada. Jika algoritme paging bersifat global, ada
kemungkinan kecil, tetapi bukan nol, bahwa halaman yang berisi buffer I/O akan dipilih untuk
dihapus dari memori. Jika perangkat I/O saat ini sedang dalam proses melakukan transfer DMA ke
halaman itu, menghapusnya akan menyebabkan sebagian data ditulis di buffer tempatnya berada, dan
sebagian data ditulis di atas just- halaman yang dimuat.
Algoritma paling sederhana untuk mengalokasikan ruang halaman pada disk adalah memiliki
partisi swap khusus pada disk atau, bahkan lebih baik, pada disk terpisah dari sistem file
(untuk menyeimbangkan beban I/O). Terkait dengan setiap proses adalah alamat disk dari area
swap-nya, yaitu, di mana pada partisi swap image-nya disimpan. Informasi ini disimpan dalam tabel
proses.
Alat penting untuk mengelola kompleksitas sistem apa pun adalah memisahkan
kebijakan dari mekanisme. Prinsip ini dapat diterapkan pada manajemen memori dengan
menjalankan sebagian besar manajer memori sebagai proses tingkat pengguna.
Semua detail tentang cara kerja MMU dienkapsulasi dalam pengendali MMU, yang
merupakan kode yang bergantung pada mesin dan harus ditulis ulang untuk setiap platform
baru yang menjadi tujuan porting sistem operasi. Ketika sebuah proses dimulai, pager eksternal
diberitahukan untuk mengatur peta halaman proses dan mengalokasikan backing store yang
diperlukan pada disk jika perlu.
Setelah proses mulai berjalan, mungkin ada kesalahan halaman. Penangan kesalahan mencari
tahu halaman virtual mana yang diperlukan dan mengirim pesan ke pager eksternal,
memberitahukan masalahnya.
Implementasi ini membuka tempat algoritma penggantian halaman diletakkan. Akan lebih
baik untuk memilikinya di pager eksternal, tetapi ada beberapa masalah dengan pendekatan
ini. Prinsip di antaranya adalah bahwa pager eksternal tidak memiliki akses keR danMbit dari
semua halaman. Keuntungan utama dari implementasi ini adalah kode yang lebih modular dan
fleksibilitas yang lebih besar. Kerugian utama adalah overhead ekstra melintasi batas kernel pengguna
beberapa kali dan overhead dari berbagai pesan yang dikirim di antara bagian-bagian sistem.