Saya sering bingung dengan konsep virtualisasi dalam sistem operasi. Mempertimbangkan RAM sebagai memori fisik, mengapa kita membutuhkan memori virtual untuk menjalankan suatu proses?
Di mana letak memori virtual ini ketika proses (program) dari hard drive eksternal dibawa ke memori utama (memori fisik) untuk dieksekusi.
Siapa yang mengurus memori virtual dan berapa ukuran memori virtual?
Misalkan jika ukuran RAM adalah 4GB (yaitu 2 ^ 32-1 ruang alamat) berapakah ukuran memori virtual?
memory-management
operating-system
virtualization
ram
virtual-memory
starkk92.dll
sumber
sumber
Jawaban:
Memori virtual, antara lain, adalah abstraksi untuk memberikan ilusi kepada pemrogram tentang memiliki memori tak terbatas yang tersedia di sistem mereka.
Pemetaan memori virtual dibuat agar sesuai dengan alamat fisik sebenarnya. Sistem operasi membuat dan menangani pemetaan ini - memanfaatkan tabel halaman, di antara struktur data lainnya untuk mempertahankan pemetaan. Pemetaan memori virtual selalu ditemukan di tabel halaman atau beberapa struktur data serupa (dalam kasus implementasi lain dari memori virtual, kita mungkin tidak boleh menyebutnya "tabel halaman"). Tabel halaman juga ada dalam memori fisik - seringkali di ruang yang disediakan kernel yang tidak dapat ditimpa oleh program pengguna.
Memori virtual biasanya lebih besar dari memori fisik - tidak akan ada banyak alasan untuk pemetaan memori virtual jika memori virtual dan memori fisik memiliki ukuran yang sama.
Hanya bagian yang diperlukan dari sebuah program yang tersimpan di memori, biasanya - ini adalah topik yang disebut "paging". Memori virtual dan paging terkait erat, tetapi bukan topik yang sama. Ada implementasi lain dari memori virtual, seperti segmentasi.
Saya dapat berasumsi salah di sini, tetapi saya berani bertaruh hal-hal yang Anda temukan sulit untuk dipahami berkaitan dengan implementasi khusus dari memori virtual, kemungkinan besar paging. Tidak ada satu cara untuk melakukan paging - ada banyak implementasi dan yang dijelaskan buku teks Anda kemungkinan besar tidak sama dengan yang muncul di OS nyata seperti Linux / Windows - mungkin ada perbedaan kecil.
Saya bisa mengoceh ribuan paragraf tentang paging ... tapi saya pikir itu lebih baik diserahkan pada pertanyaan berbeda yang menargetkan secara khusus topik itu.
sumber
Perangkat lunak berjalan di OS dengan premis yang sangat sederhana - mereka membutuhkan memori. OS perangkat menyediakannya dalam bentuk RAM. Jumlah memori yang diperlukan dapat bervariasi - beberapa perangkat lunak membutuhkan memori yang sangat besar, beberapa membutuhkan memori yang tidak seberapa. Sebagian besar (jika tidak semua) pengguna menjalankan beberapa aplikasi pada OS secara bersamaan, dan mengingat bahwa memori mahal (dan ukuran perangkat terbatas), jumlah memori yang tersedia selalu terbatas. Jadi mengingat bahwa semua perangkat lunak memerlukan sejumlah RAM, dan semuanya dapat dijalankan pada waktu yang sama, OS harus menangani dua hal:
Sekarang pertanyaan utamanya adalah bagaimana memori dikelola. Apa sebenarnya yang mengatur di mana dalam memori akan data milik perangkat lunak tertentu berada?
Keuntungan:
Kekurangan:
Ini tidak berskala. Secara teoritis, sebuah aplikasi mungkin memerlukan memori dalam jumlah besar ketika melakukan sesuatu yang sangat berat. Jadi untuk memastikan bahwa memori tidak pernah habis, area memori yang dialokasikan padanya harus selalu lebih dari atau sama dengan jumlah memori tersebut. Bagaimana jika sebuah perangkat lunak, yang penggunaan memori teoritis maksimalnya
2 GB
(karenanya memerlukan2 GB
alokasi memori dari RAM), dipasang di mesin dengan hanya1 GB
memori? Haruskah perangkat lunak dibatalkan saat startup, dengan mengatakan bahwa RAM yang tersedia kurang dari2 GB
? Atau haruskah itu berlanjut, dan saat memori yang dibutuhkan melebihi2 GB
, batalkan saja dan bail out dengan pesan bahwa tidak cukup memori tersedia?Memori tidak bisa rusak. Ada jutaan perangkat lunak di luar sana, bahkan jika masing-masing hanya dialokasikan
1 kB
memori, total memori yang dibutuhkan akan melebihi16 GB
, yang lebih dari yang ditawarkan kebanyakan perangkat. Bagaimana, kemudian, perangkat lunak yang berbeda dapat dialokasikan slot memori yang tidak mengganggu area masing-masing? Pertama, tidak ada pasar perangkat lunak terpusat yang dapat mengatur bahwa ketika perangkat lunak baru dirilis, ia harus menetapkan sendiri memori sebanyak ini dari area yang belum ditempati ini., dan kedua, bahkan jika ada, tidak mungkin melakukannya karena tidak ada. perangkat lunak praktis tidak terbatas (sehingga membutuhkan memori tak terbatas untuk menampung semuanya), dan total RAM yang tersedia pada perangkat apa pun tidak cukup untuk menampung bahkan sebagian kecil dari apa yang diperlukan, sehingga membuat batas memori yang tidak terelakkan dari satu perangkat lunak atas yang lain. Jadi apa yang terjadi ketika Photoshop ditugaskan lokasi memori1
untuk1023
dan VLC ditugaskan1000
ke1676
? Bagaimana jika Photoshop menyimpan beberapa data di lokasi1008
, kemudian VLC menimpanya dengan datanya sendiri, dan kemudian Photoshopmengaksesnya berpikir bahwa itu adalah data yang sama yang disimpan di sana sebelumnya? Seperti yang bisa Anda bayangkan, hal-hal buruk akan terjadi.Jadi jelas, seperti yang Anda lihat, ide ini agak naif.
Katakanlah perangkat baru saja dihidupkan, OS baru saja diluncurkan, saat ini tidak ada proses lain yang berjalan (mengabaikan OS, yang juga merupakan proses!), Dan Anda memutuskan untuk meluncurkan VLC . Jadi VLC dialokasikan sebagian dari RAM dari alamat byte terendah. Baik. Sekarang saat video sedang berjalan, Anda perlu memulai browser Anda untuk melihat beberapa halaman web. Kemudian Anda perlu meluncurkan Notepad untuk mencoret-coret beberapa teks. Dan kemudian Eclipse untuk melakukan beberapa pengkodean .. Tak lama kemudian memori Anda
4 GB
habis, dan RAM terlihat seperti ini:Oke, jadi sekarang Anda memutuskan bahwa Anda tidak perlu lagi membiarkan Eclipse dan Chrome terbuka, Anda menutupnya untuk mengosongkan sebagian memori. Ruang yang ditempati dalam RAM oleh proses tersebut diklaim kembali oleh OS, dan terlihat seperti ini sekarang:
Misalkan menutup keduanya akan membebaskan
700 MB
ruang - (400
+300
) MB. Sekarang Anda perlu meluncurkan Opera , yang akan menghabiskan450 MB
ruang. Ya, Anda memang memiliki lebih dari450 MB
ruang yang tersedia secara total, tapi ... itu tidak berdekatan, itu dibagi menjadi beberapa bagian, tidak ada yang cukup besar untuk muat450 MB
. Jadi Anda mendapatkan ide cemerlang, mari pindahkan semua proses di bawah ini ke atas sebanyak mungkin, yang akan menyisakan700 MB
ruang kosong dalam satu bagian di bagian bawah. Ini disebutcompaction
. Bagus, kecuali itu ... semua proses yang ada sedang berjalan. Memindahkannya berarti memindahkan alamat dari semua isinya (ingat, OS memelihara pemetaan memori yang dikeluarkan oleh perangkat lunak ke alamat memori sebenarnya. Bayangkan perangkat lunak telah mengeluarkan alamat45
dengan data123
, dan OS telah menyimpannya di lokasi2012
dan membuat entri di peta, memetakan45
ke2012
. Jika perangkat lunak sekarang dipindahkan ke memori, apa yang dulu ada di lokasi2012
tidak lagi berada di2012
, tetapi di lokasi baru, dan OS harus memperbarui peta sesuai dengan peta45
ke alamat baru, sehingga perangkat lunak bisa mendapatkan data yang diharapkan (123
) ketika menanyakan lokasi45
memori.Sepanjang yang menyangkut perangkat lunak, yang diketahui hanyalah alamat itu45
berisi data123
!)! Bayangkan sebuah proses yang mereferensikan variabel lokali
. Pada saat diakses lagi, alamatnya telah berubah, dan tidak dapat menemukannya lagi. Hal yang sama akan berlaku untuk semua fungsi, objek, variabel, pada dasarnya semuanya memiliki alamat, dan memindahkan proses berarti mengubah alamat semuanya. Yang membawa kita ke:Baik. Misalkan, entah bagaimana, dengan cara yang ajaib, Anda berhasil meningkatkan proses. Sekarang ada
700 MB
ruang kosong di bagian bawah:Opera dengan mulus masuk di bagian bawah. Sekarang RAM Anda terlihat seperti ini:
Baik. Semuanya terlihat baik-baik saja. Namun, tidak banyak ruang yang tersisa, dan sekarang Anda perlu meluncurkan Chrome lagi, memori-hog yang terkenal! Dibutuhkan banyak memori untuk memulai, dan Anda hampir tidak memiliki yang tersisa ... Kecuali .. sekarang Anda memperhatikan bahwa beberapa proses, yang awalnya menempati ruang besar, sekarang tidak membutuhkan banyak ruang. Mungkin Anda telah menghentikan video Anda di VLC , karena itu masih menempati beberapa ruang, tetapi tidak sebanyak yang dibutuhkan saat menjalankan video resolusi tinggi. Begitu pula untuk Notepad dan Foto . RAM Anda sekarang terlihat seperti ini:
Holes
, sekali lagi! Kembali ke awal! Kecuali, sebelumnya, lubang terjadi karena proses penghentian, sekarang karena proses yang membutuhkan lebih sedikit ruang dari sebelumnya! Dan Anda sekali lagi memiliki masalah yang sama,holes
gabungan menghasilkan lebih banyak ruang daripada yang dibutuhkan, tetapi mereka tersebar di sekitar, tidak banyak digunakan dalam isolasi. Jadi, Anda harus memindahkan proses itu lagi, operasi yang mahal, dan yang sangat sering, karena proses akan sering berkurang ukurannya selama masa pakainya.Baiklah, jadi sekarang, OS Anda melakukan hal yang diperlukan, memindahkan proses dan memulai Chrome dan setelah beberapa waktu, RAM Anda terlihat seperti ini:
Keren. Sekarang misalkan Anda kembali menonton Avatar di VLC . Persyaratan memorinya akan meningkat! Tapi ... tidak ada ruang tersisa untuk itu tumbuh, karena Notepad meringkuk di bawahnya. Jadi, sekali lagi, semua proses harus dipindahkan ke bawah sampai VLC menemukan ruang yang cukup!
Baik. Sekarang misalkan, Foto sedang digunakan untuk memuat beberapa foto dari hard disk eksternal. Mengakses hard-disk membawa Anda dari ranah cache dan RAM ke ranah disk, yang lebih lambat menurut urutan besarnya. Menyakitkan, tidak dapat dibatalkan, lebih lambat secara transendental. Ini adalah operasi I / O, yang berarti tidak terikat dengan CPU (justru sebaliknya), yang berarti tidak perlu menggunakan RAM sekarang. Namun, itu tetap menggunakan RAM dengan keras kepala. Jika Anda ingin meluncurkan Firefox untuk sementara waktu, Anda tidak bisa, karena tidak banyak memori yang tersedia, sedangkan jika Foto diambil dari memori selama aktivitas terikat I / O-nya, itu akan membebaskan banyak memori, diikuti oleh pemadatan (mahal), diikuti oleh pemasangan Firefox .
Jadi, seperti yang bisa kita lihat, kita memiliki banyak masalah bahkan dengan pendekatan memori virtual.
Ada dua pendekatan untuk mengatasi masalah ini -
paging
dansegmentation
. Mari kita bahaspaging
. Dalam pendekatan ini, ruang alamat virtual dari suatu proses dipetakan ke memori fisik dalam potongan - disebutpages
.page
Ukuran tipikal adalah4 kB
. Pemetaan dikelola oleh sesuatu yang disebut apage table
, diberi alamat virtual, yang harus kita lakukan adalah mencari tahupage
alamat mana , kemudian daripage table
, menemukan lokasi yang sesuai untuk itupage
di memori fisik aktual (dikenal sebagaiframe
), dan diberikan bahwa offset alamat virtual dalampage
sama untukpage
danframe
, cari tahu alamat sebenarnya dengan menambahkan offset itu ke alamat yang dikembalikan olehpage table
. Sebagai contoh:Di sebelah kiri adalah ruang alamat virtual dari suatu proses. Katakanlah ruang alamat virtual membutuhkan 40 unit memori. Jika ruang alamat fisik (di sebelah kanan) memiliki 40 unit memori juga, itu mungkin untuk memetakan semua lokasi dari kiri ke lokasi di sebelah kanan, dan kami akan sangat senang. Tapi sialnya, tidak hanya memori fisik memiliki lebih sedikit (24 di sini) unit memori yang tersedia, itu juga harus dibagi di antara banyak proses! Baiklah, mari kita lihat bagaimana kita melakukannya.
Saat proses dimulai, ucapkan permintaan akses memori untuk lokasi
35
dibuat. Di sini ukuran halaman8
(masingpage
- masing berisi8
lokasi, seluruh ruang alamat virtual40
lokasi berisi5
halaman). Jadi lokasi ini milik halaman no.4
(35/8
). Dalam inipage
, lokasi ini memiliki offset3
(35%8
). Jadi lokasi ini dapat ditentukan oleh tuple(pageIndex, offset)
=(4,3)
. Ini baru permulaan, jadi belum ada bagian dari proses yang disimpan dalam memori fisik sebenarnya. Jadipage table
, yang memelihara pemetaan halaman di sebelah kiri ke halaman sebenarnya di sebelah kanan (di mana mereka dipanggilframes
) saat ini kosong. Jadi OS melepaskan CPU, memungkinkan driver perangkat mengakses disk dan mengambil halaman no.4
untuk proses ini (pada dasarnya potongan memori dari program pada disk yang alamatnya berkisar dari32
hingga39
). Ketika tiba, OS mengalokasikan halaman di suatu tempat di RAM, katakanlah bingkai pertama itu sendiri, danpage table
untuk proses ini perhatikan bahwa4
peta halaman ke bingkai0
dalam RAM. Sekarang data tersebut akhirnya ada di memori fisik. OS kembali menanyakan tabel halaman untuk tupel(4,3)
, dan kali ini, tabel halaman mengatakan bahwa halaman4
sudah dipetakan ke bingkai0
dalam RAM. Jadi OS hanya pergi ke0
frame ke dalam RAM, mengakses data di offset3
dalam frame itu (Luangkan waktu sejenak untuk memahami ini.page
, yang diambil dari disk, dipindahkan keframe
. Jadi, apa pun offset lokasi memori individu dalam sebuah halaman, itu akan sama di bingkai juga, karena di dalampage
/frame
, unit memori masih berada di tempat yang relatif sama!), Dan mengembalikan data! Karena data tidak ditemukan di memori pada permintaan pertama itu sendiri, melainkan harus diambil dari disk yang akan dimuat ke memori, itu merupakan kehilangan .Baik. Sekarang misalkan, akses memori untuk lokasi
28
dibuat. Itu intinya(3,4)
.Page table
sekarang hanya memiliki satu entri, memetakan halaman4
ke bingkai0
. Jadi ini adalah lagi rindu , proses relinquishes CPU, device driver menjemput halaman dari disk, proses mendapatkan kembali kontrol dari CPU lagi, dan yangpage table
diperbarui. Katakanlah sekarang halaman3
tersebut dipetakan ke frame1
dalam RAM. Jadi(3,4)
menjadi(1,4)
, dan data di lokasi itu di RAM dikembalikan. Baik. Dengan cara ini, misalkan akses memori berikutnya adalah untuk lokasi8
, yang diterjemahkan menjadi(1,0)
. Halaman1
belum ada dalam memori, prosedur yang sama diulangi, danpage
dialokasikan pada frame2
dalam RAM. Sekarang pemetaan proses RAM terlihat seperti gambar di atas. Pada titik ini, RAM, yang hanya memiliki 24 unit memori yang tersedia, sudah terisi. Misalkan permintaan akses memori berikutnya untuk proses ini adalah dari alamat30
. Itu memetakan ke(3,6)
, danpage table
mengatakan bahwa halaman itu3
ada dalam RAM, dan itu memetakan ke bingkai1
. Yay! Jadi data diambil dari lokasi RAM(1,6)
, dan dikembalikan. Ini merupakan hit , karena data yang dibutuhkan dapat diperoleh langsung dari RAM, sehingga menjadi sangat cepat. Demikian pula, beberapa permintaan akses berikutnya, mengatakan untuk lokasi11
,32
,26
,27
semua hit , yaitu data yang diminta oleh proses ini ditemukan langsung di RAM tanpa perlu mencari di tempat lain.Sekarang misalkan permintaan akses memori untuk lokasi
3
datang. Ini diterjemahkan menjadi(0,3)
, danpage table
untuk proses ini, yang saat ini memiliki 3 entri, untuk halaman1
,3
dan4
mengatakan bahwa halaman ini tidak ada dalam memori. Seperti kasus sebelumnya, ini diambil dari disk, namun, tidak seperti kasus sebelumnya, RAM terisi! Lalu apa yang harus dilakukan sekarang? Di sinilah letak keindahan virtual memory, sebuah frame dari RAM digusur! (Berbagai faktor mengatur frame mana yang akan digusur. MungkinLRU
didasarkan, di mana frame yang paling terakhir diakses untuk suatu proses akan digusur. Mungkin menjadifirst-come-first-evicted
dasar, di mana frame yang dialokasikan paling lama lalu, digusur, dll. .) Jadi, beberapa bingkai digusur. Ucapkan frame 1 (pilih saja secara acak). Namun, ituframe
dipetakan ke beberapapage
! (Saat ini, itu dipetakan oleh tabel halaman ke halaman3
dari satu dan hanya satu proses kami). Jadi proses itu harus menyampaikan berita tragis iniframe
, yang malang milik Anda, harus dikeluarkan dari RAM untuk memberi ruang bagi yang lainpages
. Proses harus memastikan bahwa ia memperbaruinyapage table
dengan informasi ini, yaitu, menghapus entri untuk duo bingkai halaman itu, sehingga saat permintaan dibuat untuk itupage
, itu benar memberi tahu proses bahwa inipage
tidak lagi dalam memori , dan harus diambil dari disk. Baik. Jadi bingkai dikeluarkan,1
halaman0
dibawa masuk dan ditempatkan di sana di RAM, dan entri untuk halaman3
dihapus, dan diganti dengan0
pemetaan halaman ke bingkai yang sama1
. Jadi sekarang pemetaan kami terlihat seperti ini (perhatikan perubahan warna di detikframe
di sisi kanan):Lihat apa yang baru saja terjadi? Prosesnya harus berkembang, itu membutuhkan lebih banyak ruang daripada RAM yang tersedia, tetapi tidak seperti skenario kami sebelumnya di mana setiap proses dalam RAM harus dipindahkan untuk mengakomodasi proses yang berkembang, ini terjadi hanya dengan satu
page
penggantian! Ini dimungkinkan oleh fakta bahwa memori untuk suatu proses tidak lagi perlu bersebelahan, ia dapat berada di tempat yang berbeda dalam potongan, OS menyimpan informasi di mana mereka berada, dan bila diperlukan, mereka ditanyai dengan tepat. Catatan: Anda mungkin berpikir, huh, bagaimana jika sebagian besar adalah amiss
, dan data harus terus-menerus dimuat dari disk ke memori? Ya, secara teoritis, itu mungkin, tetapi sebagian besar kompiler dirancang sedemikian rupa sebagai berikutlocality of reference
, yaitu jika data dari beberapa lokasi memori digunakan, data berikutnya yang dibutuhkan akan ditempatkan di suatu tempat yang sangat dekat, mungkin dari tempat yang samapage
,page
yang baru saja dimuat ke dalam memori. Akibatnya, kehilangan berikutnya akan terjadi setelah beberapa waktu, sebagian besar persyaratan memori yang akan datang akan dipenuhi oleh halaman yang baru saja dibawa masuk, atau halaman yang sudah ada dalam memori yang baru saja digunakan. Prinsip yang sama persis memungkinkan kita untuk mengusir yang paling terakhir digunakanpage
juga, dengan logika bahwa apa yang sudah lama tidak digunakan, kemungkinan besar juga tidak akan digunakan untuk sementara waktu. Namun, tidak selalu demikian, dan dalam kasus luar biasa, ya, kinerja dapat menurun. Lebih lanjut tentang itu nanti.Keren. Sebelumnya kami menghadapi masalah di mana meskipun suatu proses berkurang ukurannya, ruang kosong sulit untuk diklaim kembali oleh proses lain (karena akan membutuhkan pemadatan yang mahal). Sekarang mudah, ketika ukuran proses menjadi lebih kecil, banyak di
pages
antaranya tidak lagi digunakan, jadi ketika proses lain membutuhkan lebih banyak memori,LRU
penggusuran berbasis sederhana secara otomatis mengusir mereka yang kurang digunakanpages
dari RAM, dan menggantinya dengan halaman baru dari proses lainnya (dan tentu saja memperbaruipage tables
semua proses tersebut serta proses asli yang sekarang membutuhkan lebih sedikit ruang), semua ini tanpa operasi pemadatan yang mahal!Adapun masalah 2, luangkan waktu sejenak untuk memahami ini, skenarionya sendiri sudah sepenuhnya dihapus! Tidak perlu memindahkan suatu proses untuk mengakomodasi proses baru, karena sekarang seluruh proses tidak pernah perlu muat sekaligus, hanya halaman tertentu saja yang perlu disesuaikan ad hoc, yang terjadi dengan mengeluarkan
frames
dari RAM. Semuanya terjadi dalam satuanpages
, jadi tidak ada konsep tentanghole
sekarang, dan karenanya tidak ada pertanyaan tentang apa pun yang bergerak! Mungkin 10pages
harus dipindahkan karena persyaratan baru ini, yang masih ribuan dipages
antaranya tidak tersentuh. Padahal, sebelumnya, semua proses (setiap bagiannya) harus dipindahkan!Sekarang ketika proses perlu melakukan beberapa operasi I / O, proses tersebut dapat melepaskan CPU dengan mudah! OS hanya mengeluarkan semua
pages
dari RAM (mungkin menyimpannya di beberapa cache) sementara proses baru menempati RAM sementara itu. Ketika operasi I / O selesai, OS hanya mengembalikannyapages
ke RAM (tentu saja dengan menggantipages
dari beberapa proses lain, mungkin dari proses yang menggantikan proses asli, atau mungkin dari beberapa yang perlu melakukan I / O sekarang, dan karenanya dapat melepaskan ingatan!)Dan tentu saja, sekarang tidak ada proses yang mengakses RAM secara langsung. Setiap proses mengakses lokasi memori virtual, yang dipetakan ke alamat RAM fisik dan dikelola oleh
page-table
proses itu. Pemetaan ini didukung OS, OS memungkinkan proses mengetahui frame mana yang kosong sehingga halaman baru untuk suatu proses dapat dipasang di sana. Karena alokasi memori ini diawasi oleh OS itu sendiri, ia dapat dengan mudah memastikan bahwa tidak ada proses yang mengganggu konten dari proses lain dengan hanya mengalokasikan frame kosong dari RAM, atau saat melanggar konten dari proses lain di RAM, berkomunikasi dengan proses tersebut. untuk memperbaruinyapage-table
.Jadi
paging
(di antara teknik lainnya), dalam hubungannya dengan memori virtual, adalah kekuatan perangkat lunak saat ini yang berjalan di OS-es! Ini membebaskan pengembang perangkat lunak dari kekhawatiran tentang berapa banyak memori yang tersedia pada perangkat pengguna, di mana untuk menyimpan data, bagaimana mencegah proses lain merusak data perangkat lunak mereka, dll. Namun, tentu saja ini tidak sepenuhnya terbukti. Ada kekurangannya:Paging
adalah, pada akhirnya, memberikan ilusi memori tak terbatas kepada pengguna dengan menggunakan disk sebagai cadangan sekunder. Mengambil data dari penyimpanan sekunder untuk dimasukkan ke dalam memori (disebutpage swap
, dan peristiwa tidak menemukan halaman yang diinginkan dalam RAM disebutpage fault
) mahal karena ini adalah operasi IO. Ini memperlambat proses. Beberapa pertukaran halaman seperti itu terjadi secara berurutan, dan prosesnya menjadi sangat lambat. Pernah melihat perangkat lunak Anda berjalan dengan baik dan keren, dan tiba-tiba menjadi sangat lambat sehingga hampir hang, atau membuat Anda tidak memiliki opsi untuk memulai ulang? Mungkin terlalu banyak pertukaran halaman yang terjadi, membuatnya lambat (disebutthrashing
).Jadi kembali ke OP,
Mengapa kita membutuhkan memori virtual untuk menjalankan suatu proses? - Seperti yang dijelaskan secara panjang lebar oleh jawaban, untuk memberikan ilusi perangkat lunak perangkat / OS yang memiliki memori tak terbatas, sehingga perangkat lunak apa pun, besar atau kecil, dapat dijalankan, tanpa mengkhawatirkan alokasi memori, atau proses lain yang merusak datanya, bahkan ketika berjalan secara paralel. Suatu konsep yang diimplementasikan dalam praktek melalui berbagai teknik, salah satunya seperti yang dijelaskan di sini adalah Paging . Mungkin juga Segmentasi .
Di manakah posisi memori virtual ini ketika proses (program) dari hard drive eksternal dibawa ke memori utama (memori fisik) untuk dieksekusi? - Memori virtual tidak berdiri sendiri di mana pun, itu adalah abstraksi, selalu ada, ketika perangkat lunak / proses / program di-boot, tabel halaman baru dibuat untuknya, dan berisi pemetaan dari alamat yang dikeluarkan oleh itu proses ke alamat fisik sebenarnya di RAM. Karena alamat yang dikeluarkan oleh proses bukanlah alamat sebenarnya, di satu sisi, alamat tersebut sebenarnya adalah apa yang dapat Anda katakan ,
the virtual memory
.Siapa yang mengurus memori virtual dan berapa ukuran memori virtual? - Ini diurus oleh, bersama-sama, OS dan perangkat lunak. Bayangkan sebuah fungsi dalam kode Anda (yang akhirnya dikompilasi dan dibuat menjadi dapat dieksekusi yang melahirkan proses) yang berisi variabel lokal - an
int i
. Saat kode dijalankan,i
dapatkan alamat memori di dalam tumpukan fungsi. Fungsi itu sendiri disimpan sebagai objek di tempat lain. Alamat-alamat ini dihasilkan oleh kompilator (kompilator yang mengkompilasi kode Anda ke dalam eksekusi) - alamat virtual. Ketika dijalankan,i
harus berada di suatu tempat di alamat fisik sebenarnya selama fungsi itu setidaknya (kecuali itu adalah variabel statis!), Jadi OS memetakan alamat virtual yang dihasilkan kompilatori
ke alamat fisik aktual, sehingga kapan pun, dalam fungsi itu, beberapa kode memerlukan nilaii
, proses itu dapat menanyakan OS untuk alamat virtual itu, dan OS pada gilirannya dapat menanyakan alamat fisik untuk nilai yang disimpan, dan mengembalikannya.Misalkan jika ukuran RAM adalah 4GB (yaitu 2 ^ 32-1 ruang alamat) berapakah ukuran memori virtual? - Ukuran RAM tidak terkait dengan ukuran memori virtual, itu tergantung pada OS. Misalnya, pada Windows 32 bit
16 TB
, pada Windows 64 bit, ini adalah256 TB
. Tentu saja, ini juga dibatasi oleh ukuran disk, karena di situlah memori dicadangkan.sumber
Saya tanpa malu-malu menyalin kutipan dari halaman manual atas
sumber
Lihat di sini: Memori Fisik Vs Virtual
Memori virtual disimpan di hard drive dan digunakan saat RAM diisi. Memori fisik terbatas pada ukuran chip RAM yang dipasang di komputer. Memori virtual dibatasi oleh ukuran hard drive, sehingga memori virtual memiliki kemampuan untuk menyimpan lebih banyak.
sumber