一、什麼是虛擬內存地址程序員
咱們把指令裏用到的內存地址叫作虛擬地址spa
二、什麼是物理內存地址操作系統
實際在內存硬件裏面的空間地址、咱們叫物理內存地址3d
這種找出一段連續的物理內存和虛擬內存地址進行映射的方法,咱們叫分段,這裏的段,就是指系統分配出來的那個連續的內存空間blog
分段的的辦法很好,解決了程序自己不須要關心具體的物理內存地址的問題,但它也有一些不足之處,第一個就是內存碎片的問題內存
固然,這個咱們也有解決辦法。解決的辦法叫內存交換開發
虛擬內存、分段、再加上內存交換,看起來視乎已經解決了計算機同時裝載運行不少個程序的問題內存管理
不過,你千萬不要大意,咱們都須要把一大段連續的內存數據寫到應哦按上,因此、若是內存交換的時候,交換的是一個很佔內存空間的程序這樣整個機器都會顯得卡頓編譯
更進一步地,分頁的方式使得咱們在加載程序的時候,不載須要一次性把程序記載到物理內存中,咱們徹底能夠進行虛擬內存和物理內存的頁之間的映射以後,並不真的把頁加載到物理內存裏面去硬件
實際上,咱們的操做系統,的確是這麼作的,當要讀取特定的頁,卻發現數據並無加載到物理內存裏的時候,就會觸發一個來自CPU的缺頁錯誤、咱們的操做系統會捕捉到這個錯誤,
而後將對應的頁,從存放在硬盤上的虛擬內存裏讀取出來,加載到物理內存裏,這種方式,使得咱們能夠運行那些大於咱們實際物理內存的程序,同時,這樣一來,
任何程序都不須要一次性加載完全部指令和數據,只須要加載當前須要用到的就可行了
經過虛擬內存、內存交換和內存分頁這三個技術的組合,咱們最終的到了一個程序不須要考慮實際的物理內存地址,大小和當前分配的解決方案
這些技術和方法,對於咱們程序編寫、編譯和連接過程都是透明的,這也是咱們在計算機的軟硬件開發中經常使用的一種方法,這就是加入一個間接層
經過引入虛擬內存、頁映射和內存交換,咱們的程序自己,就再也不考慮對應的真實的內存地址、程序加載、內存管理等問題了,任何一個程序、都主要把內存當成一塊完成而連續的空間來直接使用
如今回到開頭我問你的問題,咱們的電腦只有640k內存就夠了嗎?很顯然、如今看來,比爾蓋茨的這個判斷是不合理的,那爲何他會這麼認爲呢?由於他也是一個很優秀的程序員啊!
在虛擬內存、內存交換和內存分頁這三者結合之下,你會發現,其實要運行一個程序「必須」的內存是不多的。CPU只須要執行其當前的指令,極限狀況下,內存頁只須要加載一頁就行了,
再大的程序,頁能夠分紅一頁。每次,只在須要用到對應的數據和指令的時候,從應哦按上交換到內存裏目前來就行了,以如今4k內存一頁的大小,640k內存頁能放下足足160頁呢,
頁無怪乎在比爾蓋茨會說「640K ought to be enough for anyone這」樣的話
不過呢,硬盤的訪問速度比內存慢不少,因此咱們如今的計算機,沒有幾個G的內存都很差意思和人打招呼