虛擬存儲器解惑

最近看了幾天的虛擬存儲器,發現虛擬存儲器內存非常廣泛而且比較難懂,故我建了一個虛擬存儲器的類別留着日後不斷的擴展虛擬存儲器的內容。

首先我自己總結了一句話,虛擬存儲技術(不稱呼爲虛擬內存避免概念混淆不清)是一種機制,把尋址的空間和存儲空間分離,然後通過硬件、內核、操作系統、軟件來控制尋址空間和存儲空間的映射來達到高效利用內存,擴大內存,保護內存,共享內存以及實現其他一些機制。這句話是重要的,也許對我現在而言,因爲下面的一些概念名詞我現在還不知道具體的意思,但是我明顯的感覺我不能研究與一些概念上的理解了,我需要理解的是實現的機制。有人看了我的文章後發現我的錯誤或有不同意見的歡迎留言交流。

首先一些名詞概念

物理尋址: CPU直接使用物理地址訪問物理存儲器

虛擬尋址: CPU使用虛擬地址,虛擬地址經常地址翻譯得到物理地址然後通過物理地址訪問存儲器。虛擬地址-->地址翻譯-->物理地址-->存儲器訪問。虛擬尋址是間接尋址。

物理地址空間: 整個的物理存儲器的最大可以尋址空間,或者說與物理存儲器的M個字節相對應。

虛擬地址空間: 帶有虛擬存儲器的系統中,CPU虛擬尋址的最大空間,這個空間與最大地址所需要的位數來描述,現代系統典型是32位或者64位虛擬地址空間。

注意:因爲虛擬存儲技術需要使用磁盤的一部分來當做內存來使用,所以有人把這個地址空間稱爲磁盤存儲器地址空間。

物理內存 : 這個好理解,就是你的內存條

虛擬內存:這個有點模糊,也許是我自己沒有搞懂吧,嘿嘿

第一,深入理解計算機體系一書的原文 :概念上而言,虛擬存儲器(VM)被組織爲一個由存放在磁盤上的N個連續的字節大小的單元組成的數組。從這句話看來,虛擬內存應該是說就是從磁盤上劃分爲內存的部分,還有一些地方我也看到這麼說的。

第二,我上網蒐集了一下,發現還有一種說法,就是說虛擬內存是磁盤存儲器 + 物理內存纔是虛擬內存,更有人在Windows上用超級兔子或者其他軟件看過,虛擬內存是磁盤存儲器和物理內存之和。

這個我的理解,一來應該是我理解不清的緣故,也與是一個概念的混淆了,但是我現在暫且先不必多糾與虛擬內存的概念,不管是哪一個概念應該說磁盤存儲器是爲了擴充內存容量,與物理頁進行頁交換,暫存物理內存中不經常使用的頁或者物理內存不足是交換出來的頁,應該說這構成虛擬存儲技術的一部分。這樣的話那不管是那種概念我們把裏面的原理弄明白了那就沒問題了。

虛擬地址的翻譯和判斷依賴與頁表,頁表分爲內頁表和外頁表,內頁表用於虛擬地址到物理地址的轉換(一般的說的比較多的就是這個轉換),外頁表用於虛擬地址到磁盤存儲器的轉換。具體的實現很多地方寫的很清楚,我轉載的下一篇文章中也講得很清楚。因爲很多地方沒有提及到外頁表,所以這個地方我迷茫了好久。具體的通過頁錶轉換地址見下一篇文章。

對於我們做了這麼多的轉換如果只是爲了擴充內存的容量的話那這些都是不值得的,因爲對於缺頁或者交換頁的代價是很高的,因爲磁盤存儲器本質上還是訪問磁盤,只是把它當存儲器用,所以現代的系統一般把頁交換時CPU切換進程去執行其他的事情。那究竟虛擬存儲器的優勢在哪裏呢?

第一,當然很明顯的還是擴充了內存的容量,這個的話對程序員所使用的空間來說看起來變大了可以執行佔內存更大的程序了。

第二, 保護內存,因爲每一個地址都是需要通過MMU來翻譯的,通過給頁表設定標記位,比如設定可讀 可寫 等位的設置來保護只讀內存。

第三,內存共享,不同的虛擬地址可以映射到同一物理地址可以實現內存的共享。很多時候用戶需要共享代碼數據或者庫函數。通過虛擬內存可以很容易實現,而不是每一個進程都有一份拷貝。

第四,簡化鏈接,連接器使得分離編譯成爲可能,對於大型的程序可以分解爲小的模塊,然後獨立的修改和編譯在鏈接到一起。當我們改變其中一些模塊是隻要重新編譯這個模塊然後再將它鏈接到應用程序上。對於一個模塊重新編譯後,如果不使用虛擬內存的話對應的內存則將改變,則需要重新編譯整個模塊。但是對於有虛擬體統的體系則因爲是通過地址翻譯,而且每個進程都擁有獨立的地址虛擬地址空間,儘管物理內存的分配發生了改變,但是虛擬地址可以不變,只是虛擬地址到物理地址的對應關係發生了改變。

第五,簡化存儲器的分配,對於使用molloc等函數分配一段連續的空間而已,虛擬存儲器分配K個連續的虛擬空間,然後對應到物理存儲的話可以映射到任意的K個物理空間了,不一定連續。

當然虛擬存儲技術還遠遠不止這些,況且這些知識還有好多沒弄明白,但是不能太糾結與一些問題的追究,暫且先寫到這裏,以後繼續完成這個系列的知識。

2011-07-01  21:15
發佈了53 篇原創文章 · 獲贊 21 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章