如何用通俗易懂的語言解釋虛擬存儲器?

虛擬存儲器的概念和內外存之間的關係是怎樣的?計算機術語里常出現的「虛擬」,「虛」,字面語意和所指概念的關係怎麼理解。


哥的這個答案很多專家看不上,但這個答案的目的是為了通俗地讓你理解概念,如果你要明白具體每一個環節是怎麼實現的,應該去參考教科書。

你有一台電腦,內存1G,你想玩一個遊戲,但這個遊戲需要2G內存,假設是這樣。那麼你電腦的內存顯然太小,是不是意味著你的遊戲就不能玩了?如果沒有虛擬內存,那麼是的,這遊戲沒法玩了。有了虛擬內存就還可以玩。

虛擬存儲一點也不複雜:

  • 它就是當物理內存(就是你的內存條)不夠的時候,在硬碟上開一塊空間當內存來用,這塊空間不是內存條提供的,所以叫「虛擬內存」
  • 執行的程序只管問操作系統申請內存,不用管物理內存夠不夠,好像電腦有無限內存似的

    上面的例子,遊戲向操作系統申請說:給我2G內存!操作系統一看內存條只有1G,趕緊在硬碟上開闢1G空間,然後說:好嘞,給你2G!然後你的遊戲就乖乖跑了起來。你的遊戲並不知道操作系統給你的2G中有1G並不是物理內存。

    【實際的技術細節當然要比這複雜】,但是概念就是這樣。上一張萌圖:


自己先看Wikipedia,Virtual memory,哪句話看不懂了再問。


程序存放在外存,運行時需要調入內存

假設可用內存100kb,程序a大小100kb

一次將代碼全部調入內存,那麼就只能運行一個a

但是由於局部性原理,程序運行具有局部性,所以我們可以只調入需要的10kb代碼,程序便可以跑起來了,要是代碼找不著再與外存進行交換,這樣便可以開10個程序a,看上去便是用100kb內存完成了原本需要1000kb內存才能完成的任務,而且對用戶是透明的,完全可以當做有1000kb內存,這就是虛擬內存


先問你,如何把一頭大象塞進冰箱?

對,打開門,塞進去,再關上。虛擬存儲器做的恰恰就是這個工作。而這裡邊,要解決的有兩個問題,一個是如何把那麼大的大象塞進去,而不至於被門卡住;第二個是如何保證塞進去的大象不會撐爆冰箱。

首先,要知道大象是不可能被一次性塞進冰箱的,畢竟那麼大塊頭。但是呢,聰明的科學家肢解了大象,這不就可以一塊一塊地放了嘛。

然後呢,怎麼保證不被撐爆呢??????????

不可能啦!

除非你把大象壓縮成白矮星,不然冰箱是放不下的。那怎麼辦呢?

科學家在冰箱後邊又開了個門,這樣,即便冰箱滿了,還是可以繼續放大象肉。這個就有點類似段譽和喬大哥比酒量時用六脈神劍耍花招了。

那這不是瞎搞嘛,前邊進後邊出!那你這麼想想,我們每次吃大象肉,是不可能一次都吃完的吧,所以呢,我們也沒必要造那麼大的冰箱來放大象,把每次把要吃的大象肉凍進冰箱不就行了嘛。

而當冰箱里的肉快完時,這時候站在冰箱後邊的科學家就會把肉從後門再偷偷地塞進去一點。而在你看來,冰箱里的肉是始終非空的。

是不是覺得很神奇,這個就是虛擬存儲器啦啦。你把冰箱換成內存,大象換成要運行的作業或進程,科學家換成操作系統,吃肉群眾換成用戶,就是虛擬存儲器的工作流程了。


想知道為什麼叫虛擬存儲系統就要先明白它是怎麼來的。目前計算機的存儲器系統一般分為三個層次,cache—主存—輔存。cache是為了解決cpu與主存處理速度的矛盾加入的,輔存便是為了擴大主存容量。降低成本。「虛擬」字面意思就是假的,不真實的,虛擬存儲系統是忽略了主存與輔存的差異,將其都看作是主存。它基於程序的局部性原理,在程序運行時,將當前運行所需的程序和數據調於內存,其餘部分依舊放在輔存,當要運行輔存部分的程序時便從輔存調入主存,如果主存已滿,就按照一定的演算法與主存的一部分進行替換。這操作對於應用程序員而言是透明的,他們察覺不到這些由操作系統和硬體共同完成的步驟,看起來就覺得輔存也屬於主存的一部分。


首先,一條原理---程序只有從外存載入到內存中才能執行(這裡將完整的程序載入到內存中)

然後,為了提高處理機效率,產生多道程序設計技術允許---(把多個程序完整載入到一個內存中)(這裡涉及處理機調度)

因為多道程序設計技術,導致內存不夠用,但是人們發現沒必要把程序全部載入內存中執行(涉及到局部性原理)---產生動態裝入,重定位和虛擬存儲技術---分別解決程序沒必要全部裝入內存才執行,程序也沒必要在內存中必需連續,內存不足可以用外存輔助存儲。

,,,,,,,,,,,,,,

內存造價比外存貴很多,程序一部分載入到內存中先執行,另一部分還在外存,需要的時候就把這部分載入到內存中(涉及到頁面置換,覆蓋,地址變換機構),這樣本來因為內存不足原因不能夠執行的程序,就在這種機制--虛擬存儲技術下可以執行。

,,,,,,,,,,,,,,,

,,,,,,,,,,,,,,,

以上就是全部由來,詳情請看看操作系統


虛擬存儲器各位的解釋都是虛擬內存之類的,為啥不是邏輯卷、內存虛擬成硬碟、或是虛擬機中的某些概念呢?


虛擬內存主要解決兩個問題:

1.進程並發問題

內存相當於一個程序調度數據的一塊地方。

比如內存有100個地址,編號為0到99。你設計了一個軟體。要佔用0到30這塊內存空間。

可問題是在你設計程序的同時,在世界的其他地方有成百上千人也在設計不同的程序。

好了,假如你設計了軟體A,需要佔用0到30這塊內存空間。另一家軟體公司設計了軟體B,也需要佔用0到30這塊內存空間。

有一個客戶,他的電腦需要同時用到軟體A和軟體B。這可怎麼辦?兩個程序都用到了0到30這塊內存地址。這時電腦會出現問題。

所以出現了虛擬內存的概念。操作系統在虛擬內存和實際內存中間提供了一個翻譯器。使開發者可以隨意使用任何的虛擬內存地址。當使用同樣虛擬內存地址的兩個軟體同時在電腦運行時。翻譯器會將同樣的虛擬內存地址映射到不同的實際內存地址,從而使軟體之間不發生衝突。

2. 內存空間不夠用問題

假如你的電腦內存容量為2G, 但你會發現有些需要4G內存的軟體也能在你的電腦上運行,這就是虛擬內存在起作用。當一個進程運行時,虛擬內存系統會在硬碟開一片空間,將全部運行數據存在硬碟,將程序運行過程中經常使用的數據存儲在內存,也就是把內存當緩存來用了。


把程序分成一段段讀入物理內存,看上去好像一次性全放進去了


很簡單,一個飯館有20張桌子,但每天客流量好幾百人,吃完飯就走不耽誤座位。


推薦閱讀:

計算機語言算不算語言?
國人對於國外CS教材是否存在盲目崇拜心理?
Node.js是用來做什麼的?
前端的表單驗證還有必要嗎?
如何用計算機程序驗證E=mc^2?

TAG:操作系統 | 計算機系統 | 計算機科學 | 計算機專業 |