面試題:請解釋一下什麼是虛擬記憶體?

碼洞發表於2022-12-05

面試題:請解釋一下什麼是虛擬記憶體?

存對於使用者來說就是一個位元組陣列,我們可以根據地址來訪問到某個位元組或者某些位元組:

面試題:請解釋一下什麼是虛擬記憶體?

很久之前的記憶體

很久很久之前,一臺機器上只放置一個程式,作業系統僅僅作為一個函式庫存在。對於記憶體來說,除去作業系統的程式碼和資料佔用的一些空間外,其餘空間全部分配給正在執行的那個程式,畫個圖就是這樣:

面試題:請解釋一下什麼是虛擬記憶體?

小貼士:我們把執行著的程式稱之為程式。

同時執行多個程式的記憶體

後來人們覺得同時在一臺計算機上只執行一個程式太虧了,就設計了一個可以同時執行多個程式的機制。不過記憶體條只有一個,所以這些使用者程式只能共享同一個記憶體條,只能把記憶體的不同部分劃分給不同的使用者程式,畫個圖就像是這樣:

面試題:請解釋一下什麼是虛擬記憶體?

這樣子的話也有一些問題:

  • 不同使用者程式只能使用給他們規定好的那部分記憶體,也就是程式設計師在敲程式碼的時候就應該小心翼翼的計算自己使用的記憶體有沒有佔到別人家的地兒,這樣對碼農很不友好有木有。

  • 如果哪個心眼兒壞的傢伙故意去讀取別人家的程式使用的記憶體,這不就暴露了麼,更嚴重的,這個壞傢伙直接把別人家程式正在使用的記憶體的某些位元組給更新掉,這就是天坑了~

  • 能使用的記憶體空間都給規定好了,太少了有木有~

虛擬記憶體

作業系統是個老好人,使命就是解決所有使用者感到麻煩的事情。設計作業系統的大叔覺得,如果讓使用者直接去操作記憶體的話,使用者也不知道其他人到底使用了記憶體的哪些位元組,自己可以使用哪些位元組,如果要做到這一點的話人們在開發程式的時候還要聚到一起開個會,把每個人該用哪塊記憶體都規定好,即使規定好了使用者還得小心翼翼的避免使用了不屬於自己的那部分記憶體。乾脆,乾脆就不讓使用者直接操作記憶體了,讓使用者在程式設計序的時候直接把記憶體想象成一個非常非常大的位元組陣列就好了,,自己在這個位元組陣列上可以隨便折騰,他們把這個非常大的位元組陣列稱之為虛擬記憶體,由作業系統完成從虛擬記憶體的虛擬地址到真實記憶體的真實地址之間的對映工作。畫個圖就像這樣:

面試題:請解釋一下什麼是虛擬記憶體?

這樣還有問題,使用者越來越多,即使每個使用者都使用非常少的記憶體空間,那加起來佔用的記憶體空間都可能超過了真實記憶體的大小,更何況某些喪心病狂的程式設計師寫的程式裡本身就使用了超過真正記憶體大小的空間,這可怎麼辦。這難不倒設計作業系統的大叔們,他們機智的把硬碟也拉了進來。

面試題:請解釋一下什麼是虛擬記憶體?

作業系統完成由虛擬記憶體地址到真實記憶體地址或者磁碟地址之間的對映工作,這樣子給使用者提供的虛擬記憶體的地址空間就可以非常非常大,使用者程式中那些很久都用不到的記憶體空間可以被作業系統給搞到磁碟上邊儲存,什麼時候需要用了,又從磁碟中載入到真實記憶體中,重要的是這個過程全部是作業系統自動完成的,對於我們這些碼農來說,編寫程式就像是在一個炒雞大的位元組陣列上將某個地方的資料搬到另一個地方,或者將某個地方的資料經過CPU的某種加工之後再放到某個位元組陣列的某個地方,整個過程so easy,完全不用擔心有沒有讀取/覆蓋掉別人正在使用的記憶體空間。

小貼士:對於Windows作業系統來說,虛擬記憶體所需的磁碟空間從系統盤,一般是C盤分配,當你的C盤剩餘空間很少時就會導致很卡~

虛擬記憶體結構

我們說對於敲程式碼的碼農來說,虛擬記憶體就是一個超級大的位元組陣列,不過這個位元組陣列也是被劃分為多個部分的,並不是每個地方使用者都可以訪問,一般的虛擬記憶體結構長這樣:

面試題:請解釋一下什麼是虛擬記憶體?

使用者需要呼叫函式的時候,一般都會生成一個稱之為棧幀的結構,從而導致虛擬記憶體中的棧空間增長。

使用者需要單獨申請記憶體空間時,就會從堆空間分配,從而導致虛擬記憶體中的堆空間增長。

這裡需要強調的一點是,我們平時所說的作業系統核心不是一個程式,而是指作業系統的程式碼。

不知不覺我覺得超過了一分鐘,下次再見~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561269/viewspace-2656810/,如需轉載,請註明出處,否則將追究法律責任。

相關文章