面試題:請解釋一下什麼是虛擬記憶體?
內存對於使用者來說就是一個位元組陣列,我們可以根據地址來訪問到某個位元組或者某些位元組:
很久之前的記憶體
很久很久之前,一臺機器上只放置一個程式,作業系統僅僅作為一個函式庫存在。對於記憶體來說,除去作業系統的程式碼和資料佔用的一些空間外,其餘空間全部分配給正在執行的那個程式,畫個圖就是這樣:
小貼士:我們把執行著的程式稱之為程式。
同時執行多個程式的記憶體
後來人們覺得同時在一臺計算機上只執行一個程式太虧了,就設計了一個可以同時執行多個程式的機制。不過記憶體條只有一個,所以這些使用者程式只能共享同一個記憶體條,只能把記憶體的不同部分劃分給不同的使用者程式,畫個圖就像是這樣:
這樣子的話也有一些問題:
不同使用者程式只能使用給他們規定好的那部分記憶體,也就是程式設計師在敲程式碼的時候就應該小心翼翼的計算自己使用的記憶體有沒有佔到別人家的地兒,這樣對碼農很不友好有木有。
如果哪個心眼兒壞的傢伙故意去讀取別人家的程式使用的記憶體,這不就暴露了麼,更嚴重的,這個壞傢伙直接把別人家程式正在使用的記憶體的某些位元組給更新掉,這就是天坑了~
能使用的記憶體空間都給規定好了,太少了有木有~
虛擬記憶體
作業系統是個老好人,使命就是解決所有使用者感到麻煩的事情。設計作業系統的大叔覺得,如果讓使用者直接去操作記憶體的話,使用者也不知道其他人到底使用了記憶體的哪些位元組,自己可以使用哪些位元組,如果要做到這一點的話人們在開發程式的時候還要聚到一起開個會,把每個人該用哪塊記憶體都規定好,即使規定好了使用者還得小心翼翼的避免使用了不屬於自己的那部分記憶體。乾脆,乾脆就不讓使用者直接操作記憶體了,讓使用者在程式設計序的時候直接把記憶體想象成一個非常非常大的位元組陣列就好了,,自己在這個位元組陣列上可以隨便折騰,他們把這個非常大的位元組陣列稱之為虛擬記憶體
,由作業系統完成從虛擬記憶體的虛擬地址到真實記憶體的真實地址之間的對映工作。畫個圖就像這樣:
這樣還有問題,使用者越來越多,即使每個使用者都使用非常少的記憶體空間,那加起來佔用的記憶體空間都可能超過了真實記憶體的大小,更何況某些喪心病狂的程式設計師寫的程式裡本身就使用了超過真正記憶體大小的空間,這可怎麼辦。這難不倒設計作業系統的大叔們,他們機智的把硬碟也拉了進來。
作業系統完成由虛擬記憶體地址到真實記憶體地址或者磁碟地址之間的對映工作,這樣子給使用者提供的虛擬記憶體的地址空間就可以非常非常大,使用者程式中那些很久都用不到的記憶體空間可以被作業系統給搞到磁碟上邊儲存,什麼時候需要用了,又從磁碟中載入到真實記憶體中,重要的是這個過程全部是作業系統自動完成的,對於我們這些碼農來說,編寫程式就像是在一個炒雞大的位元組陣列上將某個地方的資料搬到另一個地方,或者將某個地方的資料經過CPU的某種加工之後再放到某個位元組陣列的某個地方,整個過程so easy,完全不用擔心有沒有讀取/覆蓋掉別人正在使用的記憶體空間。
小貼士:對於Windows作業系統來說,虛擬記憶體所需的磁碟空間從系統盤,一般是C盤分配,當你的C盤剩餘空間很少時就會導致很卡~
虛擬記憶體結構
我們說對於敲程式碼的碼農來說,虛擬記憶體
就是一個超級大的位元組陣列,不過這個位元組陣列也是被劃分為多個部分的,並不是每個地方使用者都可以訪問,一般的虛擬記憶體結構長這樣:
使用者需要呼叫函式的時候,一般都會生成一個稱之為棧幀
的結構,從而導致虛擬記憶體中的棧空間
增長。
使用者需要單獨申請記憶體空間時,就會從堆空間分配,從而導致虛擬記憶體中的堆空間
增長。
這裡需要強調的一點是,我們平時所說的作業系統核心
不是一個程式,而是指作業系統的程式碼。
不知不覺我覺得超過了一分鐘,下次再見~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561269/viewspace-2656810/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 虛擬記憶體有什麼用 虛擬記憶體不足怎麼解決記憶體
- 為什麼 Linux 需要虛擬記憶體Linux記憶體
- 在Linux中,什麼是虛擬記憶體?它是如何工作的?Linux記憶體
- Java記憶體模型是什麼,為什麼要有Java記憶體模型,Java記憶體模型解決了什麼問題?Java記憶體模型
- 請解釋一下什麼是Kafka的acks策略Kafka
- win10怎麼調整虛擬記憶體_win10怎麼調虛擬記憶體Win10記憶體
- 面試準備之java虛擬機器記憶體結構面試Java虛擬機記憶體
- Linux 虛擬記憶體Linux記憶體
- 聊聊虛擬記憶體記憶體
- 虛擬記憶體系統——瞭解記憶體的工作原理記憶體
- win10虛擬記憶體怎麼設定 win10虛擬記憶體設定步驟詳解Win10記憶體
- win10虛擬記憶體怎麼設定 筆記本win10虛擬記憶體怎麼看Win10記憶體筆記
- win10怎麼更改虛擬記憶體_win10更改虛擬記憶體大小方法Win10記憶體
- win10怎麼加虛擬記憶體_win10系統增加虛擬記憶體教程Win10記憶體
- win10虛擬記憶體如何優化_win10怎麼優化虛擬記憶體Win10記憶體優化
- win10 虛擬記憶體怎麼設定好 win10 虛擬記憶體設定方法Win10記憶體
- 怎麼設定虛擬記憶體win10 win10虛擬記憶體如何設定記憶體Win10
- win10虛擬記憶體怎麼設定 win10虛擬記憶體設定方法Win10記憶體
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體
- 5.虛擬記憶體記憶體
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 【知識分享】伺服器虛擬記憶體有什麼用伺服器記憶體
- win10怎麼刪除虛擬記憶體 刪除win10虛擬記憶體的方法Win10記憶體
- win10 8g記憶體虛擬記憶體設定多少合適_win10 8g記憶體怎麼分配虛擬記憶體Win10記憶體
- win10 8g記憶體還需要虛擬記憶體嗎 win10系統8g記憶體怎麼分配虛擬記憶體Win10記憶體
- win10虛擬記憶體怎麼設定最好 win10虛擬記憶體設定多少好Win10記憶體
- win10虛擬記憶體如何最佳化_win10怎麼最佳化虛擬記憶體Win10記憶體
- win10怎麼清除虛擬記憶體 win10系統虛擬記憶體清理的辦法Win10記憶體
- 虛擬記憶體(待補充)記憶體
- JVM記憶體管理面試常見問題全解JVM記憶體面試
- 什麼是Java記憶體模型?Java記憶體模型
- 什麼是Java記憶體模型Java記憶體模型
- Java虛擬機器記憶體區域詳解Java虛擬機記憶體
- 虛擬記憶體設定在c盤和d盤一樣嘛 虛擬記憶體放c盤還是d盤記憶體
- 詳解JVM中的記憶體模型是什麼?JVM記憶體模型
- 什麼是虛擬DOM
- 什麼是虛擬化?
- 記憶體管理兩部曲之虛擬記憶體管理記憶體