Saya mengerti bahwa memori virtual menipu program dengan menampilkan lebih banyak memori daripada yang sebenarnya tersedia.
Tetapi pada akhirnya harus memetakan alamat logis ke alamat sebenarnya fisik. Sekarang bagaimana cara meningkatkan memori?
Saya mengerti bahwa memori virtual menipu program dengan menampilkan lebih banyak memori daripada yang sebenarnya tersedia.
Tetapi pada akhirnya harus memetakan alamat logis ke alamat sebenarnya fisik. Sekarang bagaimana cara meningkatkan memori?
Jawaban:
Sama sekali tidak meningkatkan memori fisik . Tujuannya adalah sesuatu yang sama sekali berbeda. Apa yang dapat dilakukannya adalah menyediakan toko dukungan lain yang memungkinkan program menggunakan lebih banyak memori daripada yang tersedia secara fisik.
Memori virtual digunakan untuk memisahkan dan mengisolasi proses satu sama lain dan juga memungkinkan akses memori dialihkan ke lokasi alternatif.
Memori virtual memungkinkan sistem untuk memberikan setiap proses ruang memorinya sendiri terisolasi dari proses lain. Dengan program yang beroperasi secara efektif di ruang mereka sendiri, ini memberi mereka akses penuh ke seluruh ruang alamat daripada harus bekerja di sekitar program lain yang mungkin juga perlu menggunakan alamat "yang sama". Ini memiliki efek samping dari peningkatan keandalan dan keamanan karena proses tidak dapat dengan mudah saling mengganggu.
Ruang memori virtual aplikasi dibangun sesuai kebutuhan. Sebuah aplikasi terlihat (untuk dirinya sendiri) berada dalam satu blok memori yang berdekatan tetapi sebenarnya dapat sepenuhnya tersebar di memori fisik.
Memori virtual juga memungkinkan akses memori terperangkap dan dialihkan yang memungkinkan kita menggunakan fitur seperti file swap. Artinya, kita dapat mendorong bagian memori yang belum pernah digunakan ke disk dan mengatur pointer yang mengatakan "blok memori ini ada di file x di lokasi y" dan kemudian kita dapat membebaskan memori fisik area untuk digunakan oleh aplikasi lain. Ketika suatu aplikasi membutuhkan memori itu dapat dibaca kembali dari disk, ditempatkan di beberapa lokasi RAM fisik (berpotensi berbeda dari sebelumnya) dan dipetakan kembali ke lokasi memori virtual yang sama seperti sebelumnya.
Dengan cara yang sama seperti file halaman digunakan memori virtual juga dapat memungkinkan sistem operasi untuk melakukan apa yang secara efektif "malas" memuat pustaka bersama untuk suatu program. Ketika program utama memberi tahu sistem operasi bahwa ia ingin menggunakan perpustakaan tertentu maka sistem operasi dapat menghemat waktu dengan memeriksa persyaratan untuk perpustakaan, mengalokasikan ruang di area memori virtual untuk aplikasi, tetapi daripada memuat seluruh perpustakaan di dalamnya dapat menunda memuat halaman perpustakaan dari disk sampai mereka benar-benar diperlukan. Dengan cara ini, satu-satunya bagian perpustakaan yang dimuat ke dalam RAM adalah bagian yang benar-benar digunakan oleh program, bagian yang tidak pernah digunakan tidak pernah dimuat dan jadi jangan buang RAM.
Dengan menggunakan teknik ini, kami meningkatkan stabilitas sistem dan memungkinkan lebih banyak proses berjalan di ruang terbatas tanpa terlalu memengaruhi satu sama lain. Itu tidak "meningkatkan memori", tetapi sebaliknya memungkinkan kita untuk lebih efektif menggunakan apa yang kita miliki.
File swap diaktifkan oleh sistem memori virtual, tapi di masa lalu itu bingung menjadi memori virtual.
Sistem harus memetakan setiap alamat virtual ke alamat fisik ketika memori itu digunakan, tetapi tidak semua memori digunakan pada saat yang sama . Sebagai contoh, misalkan Anda memiliki 20 tab di browser Anda, masing-masing mengambil 1GB memori. Di OS tanpa dukungan memori virtual, Anda membutuhkan 20GB RAM agar bisa berfungsi. Caranya adalah, Anda tidak menjelajahi semua 20 tab sekaligus, jadi OS dengan memori virtual akan memungkinkan Anda untuk menggunakan browser Anda seperti itu hanya dengan beberapa GB RAM, menukar tab tidak aktif ke disk.
Memori virtual tidak digunakan secara eksklusif untuk bertukar. Tujuan utamanya sebenarnya adalah untuk menghindari fragmentasi RAM, yang merupakan masalah besar pada sistem tanpa manajemen memori virtual: Anda mungkin memiliki 1GB RAM gratis, tetapi jika itu datang dalam potongan 10MB, aplikasi yang meminta 100MB tidak akan dapat bekerja .
Seiring waktu, memori virtual menemukan lebih banyak kegunaan, terutama akses file acak: banyak aplikasi seperti database akan menjadi sangat lambat jika mereka dipaksa untuk membaca file secara berurutan, dan bekerja lebih cepat jika OS memungkinkan mereka berpura-pura seluruh file berada di (virtual) ) memori dan mengoptimalkan disk IO dan caching berdasarkan pola akses.
Memori virtual tidak menambah memori, dalam arti sebenarnya menambah lebih banyak perangkat keras memori utama. Tapi itu BISA meningkatkan jangkauan alamat yang dapat digunakan . Jadi seseorang dapat memiliki program yang berjalan yang terdiri dari segmen kode dan segmen data (tumpukan & tumpukan), dan keduanya dapat menempati kisaran alamat virtual yang lebih besar daripada rentang alamat fisik yang disediakan oleh ruang penyimpanan fisik-nyata dari mesin. Kuncinya adalah bahwa hanya sebagian kecil dari alamat virtual yang didukung oleh memori utama fisik setiap saat [tetapi semuanya pada akhirnya didukung oleh penyimpanan disk] . Ini berfungsi karena fenomena lokalitas referensi: Setiap saat, hanya instruksi di satu atau lebih bagian kecil yang berdekatan dari segmen program yang dieksekusi, dan hanya data dalam satu atau lebih bagian kecil yang berdekatan dari segmen data yang dioperasikan [tentu saja perilaku sebenarnya lebih kompleks , tapi itu mengikuti pola ini untuk sebagian besar waktu]
Saya mengerti bahwa memori virtual menipu program dengan menampilkan lebih banyak memori daripada yang sebenarnya tersedia.
Motivasi asli untuk memori virtual adalah bentuk manajemen memori untuk memberikan ruang alamat yang lebih besar dari memori fisik.
Perangkat lunak dapat memanfaatkan ruang alamat lengkap CPU (mis. 2 ^ 32 ruang alamat) sementara memori fisik yang dipasang sebenarnya hanya sebagian kecil dari angka itu.
Program besar bisa portabel di antara komputer yang menggunakan memori virtual tanpa memaksakan persyaratan memori yang besar (terpasang).
Penggunaan memori virtual ini kembali pada zaman komputer mainframe dan memori inti ferit (yang secara fisik kepadatan rendah dan mahal).
Tetapi pada akhirnya harus memetakan alamat logis ke alamat sebenarnya fisik. Sekarang bagaimana cara meningkatkan memori?
Memori virtual telah berevolusi dari sekadar teknik untuk menyediakan lebih banyak ruang alamat untuk program.
Memori virtual adalah komponen kunci dalam memberikan keamanan untuk setiap proses dalam sistem operasi modern, sehingga suatu proses tidak dapat mengganggu proses lain, atau dikompromikan oleh proses lain.
Tapi multiprocessing (jangan bingung dengan multiprocess ORS ) dengan memori virtual masih tidak menyediakan memori lebih jelas untuk sistem dari memori fisik.
Setiap proses yang dibuat disediakan dengan ruang alamat virtual sendiri, yaitu memori virtualnya sendiri.
Jumlah memori fisik yang sebenarnya digunakan (dan dipetakan ke memori virtual) untuk setiap proses adalah dinamis. Biasanya hanya memori virtual yang berisi kode (alias teks) dan halaman data / segmen untuk melakukan eksekusi proses yang dipetakan ke memori fisik (alias penduduk dalam memori).
Kode tidak penting (karena saat ini tidak dieksekusi) dan data (karena itu tidak direferensikan / diproses) tidak harus residen memori sepanjang waktu. Kode dan / atau halaman data / segmen dapat "ditukar" ke backing store (mis. Ruang swap atau file halaman pada HDD atau SSD), dan kemudian "ditukar (kembali)" sesuai kebutuhan (alias "sesuai permintaan" ).
Memori virtual memfasilitasi penggunaan memori fisik terbatas yang efisien di antara banyak proses, masing-masing dengan ruang alamat virtual yang dilindungi sendiri. Jumlah dari memori virtual ini biasanya akan lebih besar dari memori fisik yang dipasang.
"Peningkatan memori" sekarang dari perspektif sistem, dan bukan hanya dari perspektif program.
Memori virtual meningkatkan jumlah data yang dapat diatasi oleh suatu program. Dari sudut pandang perangkat lunak, kami (umumnya) tidak peduli di mana datanya disimpan. Ini dapat disimpan dalam memori DRAM fisik, dapat disimpan pada flash drive yang terhubung ke mesin, atau bahkan dapat disimpan di piring berputar. Apa yang diperhatikan oleh perangkat lunak itu adalah, ketika ia meminta untuk mengakses data itu, ia berhasil.
Dalam praktiknya, kami juga ingin program berjalan cepat. Untuk pertimbangan kecepatan , kami peduli di mana data berada. Kami ingin data yang paling sering kami akses disimpan di perangkat keras yang memungkinkan akses tercepat. Program kami ingin kehabisan DRAM. Namun, kami sering tidak memiliki cukup DRAM untuk melakukan ini. Memori virtual adalah solusinya.
Dengan memori virtual, sistem operasi "mengeluarkan" data yang sudah lama tidak digunakan, menyimpannya di hard disk. Ini masih dapat diakses, hanya lambat. Jika program meminta data yang ada di hard-disk, sistem operasi harus meluangkan waktu untuk membaca data dari disk, dan memindahkannya kembali ke DRAM.
Secara teori, itu bisa saja membaca data langsung dari disk. Namun, ada alasan mengapa hal itu tidak dilakukan. Program tidak mau harus menyadari semua komplikasi ini. Kita dapat dan memang menulis perangkat lunak yang secara cerdas memasukkan data ke disk (disebut caching). Namun, dibutuhkan banyak kerja ekstra. Cara tercepat yang dapat kita lakukan dalam kode adalah:
if data is not in memory
read data from disk into memory
operate on data
Pembaca yang cerdik akan memperhatikan bahwa, bahkan jika data ada dalam memori, kami harus memiliki persyaratan untuk memeriksa apakah data itu ada. Ini jauh lebih lambat daripada hanya beroperasi di memori secara langsung!
Memori virtual menyelesaikan masalah ini dengan melakukan check-in perangkat keras pada CPU. CPU berada dalam posisi untuk melakukan operasi memori virtual ini dengan sangat cepat karena dapat mendedikasikan perangkat keras untuk itu. Setiap upaya untuk melakukan ini dalam perangkat lunak saja harus menggunakan bagian tujuan umum dari CPU, yang secara alami lebih lambat daripada transistor khusus.
Ini mengarah pada mengapa kita selalu mem-page data kembali ke memori daripada hanya membacanya dari disk dan membiarkannya begitu saja. Kami memecah memori menjadi "halaman," yang masing-masing ditandai sebagai ada atau tidak ada dalam memori. Sistem operasi memelihara tabel ini dalam format yang nyaman bagi CPU untuk digunakan secara langsung. Setiap kali suatu program mengakses data yang ada, perangkat keras pada CPU memberi mereka akses ke data dalam DRAM secara langsung. Ketika data tidak ada, "kesalahan halaman" dikeluarkan, memberitahu sistem operasi untuk memuat halaman itu dari disk ke beberapa halaman fisik memori dan memperbarui tabel untuk mengarahkan CPU ke halaman fisik baru ini.
Kunci dari seluruh masalah ini adalah untuk meminimalkan penggunaannya. Dalam praktiknya, kami menemukan bahwa sistem operasi sangat baik dalam memilih data apa yang akan disimpan dalam memori dan data apa yang akan keluar ke disk, sehingga sebagian besar akses memori terjadi tanpa pernah menyebabkan kesalahan halaman.
Itu dilakukan dengan membuat entri peta sementara.
Ketika sebuah program mengakses alamat logis, CPU mencari di dalam peta untuk alamat fisik yang sesuai. Jika ditemukan, akses memori berlangsung seperti yang diharapkan; jika tidak ditemukan maka alamat fisik harus dialokasikan dan konten dimuat dari penyimpanan lain - "ruang swap". Jika setiap alamat fisik telah dialokasikan ke beberapa alamat logis, maka beberapa alamat logis harus "ditukar" (kontennya disimpan kembali ke ruang swap) untuk membuat alamat fisik tersedia.
Memori yang dialokasikan maksimum adalah ukuran ruang swap, yang bisa jauh lebih besar dari memori yang dipasang. Mungkin bermanfaat untuk menganggap ruang swap sebagai memori "nyata", dan RAM sebagai cache berkecepatan tinggi untuk ruang swap.
(Ini jauh dari deskripsi menyeluruh, ini dimaksudkan untuk menjawab pertanyaan langsung tanpa masuk ke detail yang relevan-tetapi-tidak perlu.)
Konsep dasar bergantung pada fakta bahwa CPU modern dapat mengelola tabel terjemahan dengan melacak "rentang alamat apa yang telah dialokasikan proses tertentu untuk digunakan, dan alamat fisik mana (pikirkan A00..Axx garis pada bus memori), JIKA ADA , saat ini digunakan untuk benar-benar menyimpan data. "JIKA ADA" karena "tidak ada sama sekali" adalah keadaan yang mungkin dan dapat diterima: Dalam hal ini, kondisi kesalahan (yang disebut "kesalahan halaman") akan dinaikkan pada tingkat perangkat keras - dan kesalahan ini akan memicu penangan level OS yang dapat mis memuat konten memori yang telah ditulis ke file swap kembali ke lokasi bebas di memori fisik (jika dibaca) atau menemukan lokasi aktual untuk meletakkan barang (di kasus penulisan), perbarui tabel terjemahan yang disebutkan di atas,dan hanya KEMUDIAN kontrol tangan kembali ke proses yang mencoba mengakses memori itu .. dan yang akan menjadi tidak bijaksana dari apa yang terjadi.
Memori virtual:
1) memungkinkan ruang alamat virtual besar untuk dipetakan ke sejumlah kecil memori fisik, dengan kelebihan "swap" ke disk, atau SSD, atau prospektif ke NVRAM dan perangkat lain.
2) memungkinkan ruang alamat virtual yang lebih besar (mis. 64-bit) dipetakan ke ruang alamat fisik yang lebih kecil (mis. 32 atau 64 bit)
3) memungkinkan ruang alamat virtual yang lebih kecil (misalnya 32 bit) untuk dipetakan ke ruang alamat fisik yang lebih besar (misalnya 40 bit), dan dengan demikian memungkinkan aplikasi yang lebih tua untuk mengambil keuntungan dari DRAM lebih fisik.
4) memungkinkan memori fisik yang kami terfragmentasi dan tidak bersebelahan dalam ruang alamat fisik untuk diberikan secara bersebelahan dalam ruang alamat virtual.
5) memungkinkan proses untuk diberi ruang alamat virtual mereka sendiri, dan karenanya terisolasi satu sama lain.
6) memungkinkan berbagai alamat virtual yang kebetulan berbagi nilai data yang sama untuk mengalokasikan satu halaman fisik.
Ini dapat terjadi dalam satu proses atau OS - kebanyakan OS yang diturunkan BSD UNIX memiliki satu halaman baca-saja dari nol, yang dapat dipetakan ke dalam halaman virtual yang diisi nol, biasanya SAP (Copy On Write - baca hanya nol, tulis terperangkap dan halaman dibagikan dan dibuat dapat ditulisi).
Hal ini dapat terjadi di antara proses - mis. Garpu UNIX () menciptakan proses anak yang berbagi hampir semua memori virtual dengan cara SAP.
Hal ini dapat terjadi di antara OS - misalnya OS Tamu di host mesin virtual dapat membuat halaman terdeduplikasi, berbagi Kontrak Karya, dll. (Beberapa serangan keamanan baru-baru ini telah mengambil keuntungan dari ini.)
7) memori virtual dapat memungkinkan bagian ruang alamat virtual dipetakan ke file, atau ke memori yang dipetakan pada prosesor lain, baik dalam sistem multiprosesor yang sama, atau di Internet.