我對于虛擬地址空間和虛擬內(nèi)存的理解:32位的CPU中,一個進程都有個4G的虛擬地址空間;虛擬內(nèi)存是存在于硬盤上的頁交換文件。 前段時間聽了一個報告,報告人竟然一再強調(diào)說MMU管理的是虛擬內(nèi)存,個人認為MMU管理的應該是進程的虛擬地址空間吧? 回來查了下《WINODWS核心編程》,發(fā)現(xiàn)第五版的中文版本中對這兩個概念說的也不清楚,如P362頁:磁盤上的文件一般被稱為頁交換文件,其中包含虛擬內(nèi)存。難道頁交換文件不是等價于虛擬內(nèi)存嗎?
歡迎大家討論,最后能得出個一致的結(jié)論。 | | ? | | ? |
|
回復次數(shù):38 |
?
?
?
| #1樓 得分:0回復于:2009-06-19 11:10:30
|
精華推薦:一個跟線程同步類似的問題,請各位幫幫看看出錯原因 |
?
?
- microyzy
- (分也許不少,但別誤會俺是高手)
-
- 等 級:
-
| #2樓 得分:4回復于:2009-06-19 11:42:36
硬盤上的文件是虛擬內(nèi)存交換到磁盤的結(jié)果,虛擬內(nèi)存就是你的程序能訪問到的那些內(nèi)存,這是相對于真正的內(nèi)存物理地址而言,這是我的理解。我覺得,windows核心已經(jīng)解釋得足夠清晰了,如果認為模糊,那么多讀幾次,另外補下基礎知識,其實,有幾個人完全清楚捏-_- | | ? |
|
精華推薦:三流大學在校一年級學生(碩士),畢業(yè)想找C/C++方面工作,薪水在6000元/月以上,請有經(jīng)驗的高手指點,我在學校應該從哪些方向?qū)W習哪些方面的知識? |
?
?
| #3樓 得分:4回復于:2009-06-19 12:30:18
第一個問題: ? 虛擬內(nèi)存是一個4G的地址空間,是一個空間,有部分對應實在的代碼和數(shù)據(jù),還有很多是空的地址,不對應實際的代碼和數(shù)據(jù)。 第一個疑點: ? MMU管理的確實是虛擬內(nèi)存,它是CPU的一個物理部件。 第二個問題: ? 虛擬內(nèi)存對應實在的代碼和數(shù)據(jù)存在兩個地方,一個是按頁存入物理內(nèi)存(以下簡稱內(nèi)存),另一個是按頁存入硬盤。在硬盤上的部分是以文件形式存在,目的是為了換入換出內(nèi)存,所以叫頁交換文件。 ? 說明白點:頁交換文件不是虛擬內(nèi)存(白馬非馬),是其中的一種存在形式,另一種形式是內(nèi)存(黑馬也是馬)。 問題擴充: ? 舉例,可執(zhí)行文件運行時要先裝載,但并沒有把所有代碼和數(shù)據(jù)從硬盤復制到內(nèi)存(內(nèi)存和硬盤中各有部分,并且以頁形式存在,一般頁有4KB大小),當程序執(zhí)行到某個代碼或數(shù)據(jù)時,如果內(nèi)存中沒有,那么CPU就產(chǎn)生一個異常(因為CPU只能直接存取在內(nèi)存中的代碼和數(shù)據(jù),不能直接訪問硬盤中的),然后通過MMU控制把對應的代碼或數(shù)據(jù)的頁從硬盤調(diào)入內(nèi)存,再回到產(chǎn)生異常的指令,重新執(zhí)行(當然代碼或數(shù)據(jù)已經(jīng)在內(nèi)存,這次不產(chǎn)生異常了)。 問題溯源: ? 那為什么不全部調(diào)入內(nèi)存? ? 因為要在我的32M的物理內(nèi)存的586電腦中執(zhí)行大于32M的程序(比如WIN2000)。 ? 還有一個好處,可以把物理內(nèi)存中長時間沒用到的數(shù)據(jù)和代碼頁移出到硬盤,騰出內(nèi)存空間我再開始運行另一個新的程序。 ? 還有一個好處,....虛擬內(nèi)存的用處很多。 | | ? |
|
精華推薦:MFC實現(xiàn)模擬線程同步(司機與售票員)(附有源碼) |
?
?
- sandyandy
- (songwenchao)
-
- 等 級:
-
| #4樓 得分:0回復于:2009-06-19 12:35:45
虛擬內(nèi)存就是用頁面文件來充當內(nèi)存使用. 某種意義上是一致的,但不是絕對相等的 | | ? |
|
精華推薦:谷歌瀏覽器優(yōu)化綠色版,大家都來用用提提建議啊 |
?
?
| #5樓 得分:0回復于:2009-06-19 12:37:36
“還有一個好處,可以把物理內(nèi)存中長時間沒用到的數(shù)據(jù)和代碼頁移換出到硬盤中的頁交換文件,騰出內(nèi)存空間我再開始運行另一個新的程序。”
這樣改一下更好理解。 | | ? |
|
精華推薦:感受微軟外包項目(一) |
?
?
| #6樓 得分:4回復于:2009-06-19 12:50:09
虛擬內(nèi)存是一個Windows內(nèi)存管理的概括 非要說是由什么組成的:物理內(nèi)存、頁文件和映射文件都是虛擬內(nèi)存機制的一部分
說虛擬內(nèi)存就是頁文件并不正確,映射文件的部分后援存儲器都是直接對應磁盤文件的,而不是頁文件 | | ? |
|
|
?
?
| #7樓 得分:0回復于:2009-06-19 13:41:53
非常感謝以上各位的回答,談談自己的看法。 microyzy:虛擬內(nèi)存就是你的程序能訪問到的那些內(nèi)存,我認為這句話是不確切的。程序的進程地址空間的用戶區(qū)所有映射的內(nèi)存,我的程序應該都能訪問,包括實際的物理內(nèi)存。 tumen:虛擬內(nèi)存是一個4GB的地址空間,-----。我認為虛擬內(nèi)存理論上是最大值是4GB的地址空間(32位尋址),但實際上虛擬內(nèi)存僅僅是進程地址中映射到頁交換文件中的那部分。 wocow3:說虛擬內(nèi)存就是頁文件并不正確,映射文件的部分后援存儲器都是直接對應磁盤文件的,而不是頁文件。文件映射部分絕對不是虛擬內(nèi)存機制。
綜合以上各位的回答,有幾個相互混淆的概念: 1、進程地址空間和虛擬內(nèi)存應該不是同一概念,在tumen的敘述中我覺得存在將兩者等價的嫌疑; 2、虛擬內(nèi)存和實際的物理內(nèi)存絕對不是一個誰包含于誰的概念。在tumen、wocow3的敘述中都有將物理內(nèi)存劃入到是虛擬內(nèi)存機制的一部分之嫌疑。我覺得虛擬內(nèi)存應該是相對于物理內(nèi)存而言的。
目前我的理解: 每個進程都有個4G的進程虛擬地址空間,虛擬地址空間和實際的物理存儲介質(zhì)(包括物理內(nèi)存、硬盤等)具有映射關(guān)系,而映射到頁交換文件的那部分即為虛擬內(nèi)存。
請大家批評修正。 | | ? |
|
|
?
?
| #8樓 得分:0回復于:2009-06-19 14:04:12
引用 4 樓 sandyandy 的回復: 虛擬內(nèi)存就是用頁面文件來充當內(nèi)存使用.
某種意義上是一致的,但不是絕對相等的 某種意義上是一致的?哪種意義上是一致的? 但不是絕對相等的?什么時候體現(xiàn)出區(qū)別? 還請sandyandy兄詳細指教。 | | ? |
|
|
?
?
| #9樓 得分:0回復于:2009-06-19 14:18:41
代碼和數(shù)據(jù)要放到內(nèi)存中才能跑 虛擬內(nèi)存就是一種機制,讓有限的物理內(nèi)存運行更大更多的程序。 當物理內(nèi)存中不夠時,需要將內(nèi)存的頁換出或是丟棄。 那么對于映射文件,直接在內(nèi)存中清除就可以了,而不是換出到頁文件保存。 | | ? |
|
|
?
?
- justin_bo
- (justin_bo)
-
- 等 級:
-
| #10樓 得分:0回復于:2009-06-19 14:29:29
攪胡了~~ 虛擬內(nèi)存空間就是操作系統(tǒng)讓你覺得你能使用的內(nèi)存空間吧。 | | ? |
|
|
?
?
| #11樓 得分:0回復于:2009-06-19 14:39:33
引用 9 樓 wocow3 的回復: 代碼和數(shù)據(jù)要放到內(nèi)存中才能跑
虛擬內(nèi)存就是一種機制,讓有限的物理內(nèi)存運行更大更多的程序。 當物理內(nèi)存中不夠時,需要將內(nèi)存的頁換出或是丟棄。
那么對于映射文件,直接在內(nèi)存中清除就可以了,而不是換出到頁文件保存。 如果說虛擬內(nèi)存是一種機制的話,我同意,但是,虛擬內(nèi)存機制和文件映射的機制明顯不是一樣的。 虛擬內(nèi)存機制應該只是內(nèi)存管理機制中的一種。 虛擬內(nèi)存機制是在給進程地址空間劃撥實際物理存儲器時,用的是頁交換文件。不知這樣wocow3兄是否同意? | | ? |
|
|
?
?
| #12樓 得分:0回復于:2009-06-19 16:04:14
虛擬內(nèi)存機制是在給進程地址空間劃撥實際物理存儲器時,用的是頁交換文件。 ------------------- 當然不全是,可執(zhí)行程序的代碼段多是直接映射內(nèi)存的。在劃撥實際物理存儲器不用頁交換文件 | | ? |
|
|
?
?
| #13樓 得分:0回復于:2009-06-19 16:10:00
|
|
?
?
| #14樓 得分:0回復于:2009-06-19 16:45:20
引用 12 樓 wocow3 的回復: 虛擬內(nèi)存機制是在給進程地址空間劃撥實際物理存儲器時,用的是頁交換文件。 -------------------
當然不全是,可執(zhí)行程序的代碼段多是直接映射內(nèi)存的。在劃撥實際物理存儲器不用頁交換文件 可執(zhí)行程序的代碼段是用的直接映射,劃撥存儲器時也是不用頁交換文件.但是這種方式就不是 虛擬內(nèi)存機制,而是文件映射. | | ? |
|
|
?
?
| #15樓 得分:0回復于:2009-06-19 20:16:34
搞深了。如果不怕不明白,我就往深處說說。
? 虛擬內(nèi)存世上本不存在,在8086,或者說80186(不要說沒聽過,后來多用于單片機了)以前,程序?qū)?nèi)存的訪問,不管是代碼地址還是數(shù)據(jù)地址,都是直來直去,是幾號單元就去幾號內(nèi)存單元找,當然,最復雜的也就算 段地址×16+偏移地址了。 ? 從286開始引入虛擬內(nèi)存,當然,我們現(xiàn)在很少見到針對286虛擬內(nèi)存的程序。 ? 經(jīng)過完善,386時虛擬內(nèi)存全面登場,“虛擬內(nèi)存”加上“32位數(shù)據(jù)和地址”兩大特性成為劃時代的經(jīng)典CPU,這也是現(xiàn)在很多操作系統(tǒng)文件中殘留i386、386、32等字樣的歷史原因。 ? 386的一大突破就是設計了一個功能強大(相對286)可以使用虛擬內(nèi)存地址尋址的MMU(內(nèi)存管理單元),把物理內(nèi)存(簡稱內(nèi)存)劃分成一頁一頁來管理,一頁內(nèi)存大小是固定的(一般是4KB并按4KB地址對齊),把每頁的首地址按順序排成一個數(shù)組放在內(nèi)存,稱為頁表,頁表的大小也是固定的,再把頁表的首地址排成數(shù)組放在內(nèi)存,稱為頁目錄表,再把頁目錄表的首地址用一個專用CPU寄存器保存。 ? 程序代碼通過MMU進行虛擬內(nèi)存尋址時,先取出專用寄存器中保存的頁目錄表首地址,再用32位虛擬地址的高20位作為索引來一層一層的查目錄表查頁表找到物理內(nèi)存頁的首地址,用虛擬地址低12位(對于4kb頁)做頁內(nèi)偏移來找到指定單元。
如果非要說的再明白一點,那么:虛擬內(nèi)存就是程序代碼不能直接訪問物理內(nèi)存的一種間接訪問物理內(nèi)存的機制。或者說是把程序中的地址值x和物理內(nèi)存單元地址值y用y=f(x)的方式架開分隔。
每個進程都有自己的一套獨立的頁表和頁目錄(在進程創(chuàng)建時建立),CPU切換進程時,只要把下一個進程的頁目錄表的首地址寫入專用寄存器,就開始尋址該進程的代碼和數(shù)據(jù)了(頁目錄表的首地址是領導,領導換了,下面的頁目錄和頁表這些小頭目也變成了另一套班子了)。
對于一個進程來說,它能見到和使用的一切內(nèi)存地址都是虛擬內(nèi)存地址(不管訪問最終目標的是在內(nèi)存中,還是硬盤上),物理內(nèi)存地址也就只有操作系統(tǒng)偶爾私自在背后把玩把玩,什么時候都不要認為你的程序中的地址是物理內(nèi)存地址,它會去直接訪問物理內(nèi)存地址。(除非你是在做操作系統(tǒng))
在物理內(nèi)存中只有一套操作系統(tǒng)的代碼,把所有操作系統(tǒng)代碼頁的頁首地址在每個進程的頁表和頁目錄表中都抄一份,那么每個進程就可以共享同一個操作系統(tǒng)的代碼了。
虛擬內(nèi)存地址通常絕不等于物理內(nèi)存地址,隔了十萬八千里,風牛馬不相及。
當然,頁表和頁目錄中有很多不對應物理內(nèi)存頁的空項,這些空項要么是程序沒用到那么多的內(nèi)存,要么該頁放在了硬盤上,這些信息在頁表項和頁目錄表項的指定位上有標記指示,當MMU查到這些頁表項或頁目錄表項時,會根據(jù)標記確定是出錯(因為訪問了程序使用范圍外的虛擬內(nèi)存地址)或者調(diào)入硬盤中對應的映射頁到內(nèi)在存并登記頁表和頁目錄更改對應項的標記。
同樣,即使沒有映射到硬盤上一個字節(jié),你的程序全部裝載到物理內(nèi)存,進程使用的還是虛擬內(nèi)存地址,因為虛擬內(nèi)存和是否使用硬盤沒有必然關(guān)系,說的直白一點,即使一臺沒有硬盤的電腦,它也能使用虛擬內(nèi)存。
系統(tǒng)并不機械地建立一個從00000000h到0ffffffffh的4GB虛擬內(nèi)存映射的頁表和頁目錄,只對那些隔三插王的使用了的虛擬地址才建立對應的頁表和頁目錄,否則的話,小小的內(nèi)存全被一個個進程的頁表和頁目錄填滿了。
這些基本原理明白后就可以清醒了。 | | ? |
|
|
?
?
| #16樓 得分:0回復于:2009-06-19 20:22:50
在WindowXP上編程,就是在使用虛擬內(nèi)存。 | | ? |
|
|
?
?
| #17樓 得分:0回復于:2009-06-20 09:37:34
引用 16 樓 tumen 的回復: 在WindowXP上編程,就是在使用虛擬內(nèi)存。 tumen: ? 您好! 感謝你給出的很多原理性的解釋,通俗易懂,讓我學到了 很多東西.但是,我始終認為你把進程的虛擬地址空間和虛擬 內(nèi)存的概念搞混淆了,呵呵,也許我太犟,不過純粹是學術(shù)討論, 還請不吝賜教. | | ? |
|
|
?
?
- ok1234567
- (ok1234567)
-
- 等 級:
-
| #18樓 得分:3回復于:2009-06-20 11:12:57
我覺得,虛擬內(nèi)存與虛擬內(nèi)存管理技術(shù)是不同的概念
虛擬內(nèi)存是與物理內(nèi)存對應的一個概念,指的是有假包換的假內(nèi)存,也就是用硬盤充當(冒充)的內(nèi)存
至于虛擬內(nèi)存管理技術(shù),進程空間那是另外一套符號體系:) | | ? |
|
|
?
?
| #19樓 得分:0回復于:2009-06-20 12:04:06
引用 18 樓 ok1234567 的回復: 我覺得,虛擬內(nèi)存與虛擬內(nèi)存管理技術(shù)是不同的概念
虛擬內(nèi)存是與物理內(nèi)存對應的一個概念,指的是有假包換的假內(nèi)存,也就是用硬盤充當(冒充)的內(nèi)存
至于虛擬內(nèi)存管理技術(shù),進程空間那是另外一套符號體系:) 感謝OK1234567的回復,我非常贊同你的解釋.也就是說,虛擬內(nèi)存和虛擬內(nèi)存管理技術(shù)、進程地址 空間是不同的概念。并且虛擬內(nèi)存就是硬盤充當?shù)哪遣糠謨?nèi)存,即是頁交換文件的一部分。希望大家能得 出個統(tǒng)一的認識,求同存異。 | | ? |
|
|
?
?
| #20樓 得分:0回復于:2009-06-20 13:49:03
我理解:進程地址是一個程序的運行空間,程序的運行需要在內(nèi)存中進行,虛擬內(nèi)存技術(shù)實現(xiàn)了進程地址到內(nèi)存地址的映射。 | | ? |
|
|
?
?
- cnzdgs
- (滿天星\n技術(shù)問題請勿私聊)
-
- 等 級:
2 更多勛章 | #21樓 得分:3回復于:2009-06-20 21:04:57
虛擬地址空間包括已分配和未分配的空間,已分配的就是虛擬內(nèi)存,虛擬內(nèi)存的儲存單元可能是物理內(nèi)存,也可能是磁盤文件。 | | ? |
|
|
?
?
| #22樓 得分:2回復于:2009-06-21 01:24:59
記得以前的286,386 CPU內(nèi)存是分開的,一個是代碼段,另外一個數(shù)據(jù)段,后來到MMX 就改了,好像說用線性內(nèi)存管理, 我覺得tumen兄,講的是CPU對內(nèi)存尋址技術(shù)(虛擬內(nèi)存管理技術(shù))好像是單片機8031+RAM 而所謂"虛擬內(nèi)存"是在Win系統(tǒng)下建立,有相應多的硬件I/O支持,有不經(jīng)CPU的大流量數(shù)據(jù)塊傳輸(DMA),有硬盤..等等!
隨便說說而已,錯了多多包涵!
| | ? |
|
|
?
?
| #23樓 得分:0回復于:2009-06-21 14:23:29
我在樓主的帖子上耗費的時間已有5個小時,(不要認為僅僅是打幾十個字的時間,我要針對問題去長時間思考和組織語言,目的是用簡單的語言說明白,我從不喜歡從GOOGLE的搜索結(jié)果中粘貼,我認為我知道的我一定能說明白),但我認為這點時間還是值得。很大的原因在于我不想讓曾經(jīng)困惑我很久的問題讓后來者再踏上同一條曲折的彎路。
引用 7 樓 jcsnwpu 的回復: 非常感謝以上各位的回答,談談自己的看法。
microyzy:虛擬內(nèi)存就是你的程序能訪問到的那些內(nèi)存,我認為這句話是不確切的。程序的進程地址空間的用戶區(qū)所有映射的內(nèi)存,我的程序應該都能訪問,包括實際的物理內(nèi)存。
tumen:虛擬內(nèi)存是一個4GB的地址空間,-----。我認為虛擬內(nèi)存理論上是最大值是4GB的地址空間(32位尋址),但實際上虛擬內(nèi)存僅僅是進程地址中映射到頁交換文件中的那部分。
wocow3:說虛擬內(nèi)存就是頁文件并不正確,映射文件的部分后援存儲器都是直接對應磁盤文件的,而不是頁文件。文件映射部分絕對不是虛擬內(nèi)存機制。
綜合以上各位的回答,有幾個相互混淆的概念: 1、進程地址空間和虛擬內(nèi)存應該不是同一概念,在tumen的敘述中我覺得存在將兩者等價的嫌疑;
2、虛擬內(nèi)存和實際的物理內(nèi)存絕對不是一個誰包含于誰的概念。在tumen、wocow3的敘述中都有將物理內(nèi)存劃入到是虛擬內(nèi)存機制的一部分之嫌疑。我覺得虛擬內(nèi)存應該是相對于物理內(nèi)存而言的。
目前我的理解:
每個進程都有個4G的進程虛擬地址空間,虛擬地址空間和實際的物理存儲介質(zhì)(包括物理內(nèi)存、硬盤等)具有映射關(guān)系,而映射到頁交換文件的那部分即為虛擬內(nèi)存。
請大家批評修正。 ? 對于以上問題和疑惑我認為我已經(jīng)說明白了,但又為什么不能讓人明白,我只好模擬通常學東西的方法,上GOOGLE搜了一下“虛擬內(nèi)存”,我明白了,我也想起了我以前走的彎路。 ? 又是微軟,又是WINDOWS,還是微軟,還是WINDOWS。 ? 再說兩段,能明白就明白吧。 ??? ? 1.如果是網(wǎng)管,或者經(jīng)常修機裝系統(tǒng),能把虛擬內(nèi)存理解成你設置在硬盤的C盤或D盤或E盤等邏輯盤上一個多達幾百MB或幾個GB的交換文件,沒錯,按照微軟或者WINDOWS的定義沒錯,你是合格的,勝任自己的工作。 ? 2.如果是編程,特別是中低層相關(guān)的系統(tǒng)編程(相對于網(wǎng)頁、PHOTOSHOP\3DMAX等),按MS的定義你必將走上和我曾經(jīng)一樣的充滿困惑和疑慮的彎路。
? 建議兩條路可走:A.抱緊MS的教條,繼續(xù)疑惑別人的一些觀點并一直疑惑下去,成為程序生涯中一個不愿面對的死胡同。B.讓MS的教條去死吧,去接受一個真正的、開放意義上的虛擬內(nèi)存,讓自己對電腦軟硬件的認識有一個更高視野。低眉信首,疑云隨風散。
? 也許我的效率低了,近兩個小時,但我還是希望都能明白。 | | ? |
|
|
?
?
| #24樓 得分:0回復于:2009-06-21 22:55:38
真是無語了,刨根問底是好的,但是不能像孔乙己那樣追究茴香豆茴字的寫法,那就變成了掉書袋了,毫無意義。 | | ? |
|
|
?
?
| #25樓 得分:0回復于:2009-06-22 00:35:48
其實“虛擬內(nèi)存”是宏觀概念!就好像兩父子,父親(CPU有虛擬的技術(shù)),到兒子(系統(tǒng))繼承了該技術(shù),再發(fā)揚光大應用到硬盤上!只不過一些人講他父親的屬性,一些講兒子的屬性,一些講他家族的屬性! 大家都有道理!! | | ? |
|
|
?
?
| #26樓 得分:0回復于:2009-06-22 08:38:41
引用 24 樓 codewarrior 的回復: 真是無語了,刨根問底是好的,但是不能像孔乙己那樣追究茴香豆茴字的寫法,那就變成了掉書袋了,毫無意義。
感謝您的回復.其實虛擬內(nèi)存對WINDOWS編程人員來是說,是相當重要的一個概念.也許有很多人像我這樣 地在困惑,也許是我的領悟能力太差,但絕不是孔乙己的茴香豆,謝謝. | | ? |
|
|
?
?
| #27樓 得分:0回復于:2009-06-22 08:59:12
感謝大家,感謝microyzy,tumen,wocow3,ok1234567,cnzdgs,zufei. 討論是必要的,爭議也是將認識和技術(shù)升華的一種的動力.或許最終沒有得出一個 統(tǒng)一的結(jié)論,但是我還是從這個帖子中受益良多. 最后尤其要感謝tuemn,在這個帖子上花費了很多寶貴的時間,甚至讓我一度不能贊成 他的觀念,但腦子里卻認為他應該是對的,自己盡量朝他的方向去想.但遺憾的是,他最終 未能說服我,也許他的觀點是對的.最后,也想給tumen一點建議:你說的很多,也很詳細, 從原理上講也是對的,但更多的是缺少回答問題的針對性,比如我一再和你強調(diào)的進程地址 空間和你說的虛擬內(nèi)存到底是什么區(qū)別等,你從未正面回答這些問題. 最后,謝謝大家.祝大家工作順利,月月加薪! |
|
轉(zhuǎn)載于:https://www.cnblogs.com/dirichlet/archive/2011/03/17/1987182.html
總結(jié)
以上是生活随笔為你收集整理的地址空间和虚拟内存(转载)http://topic.csdn.net/u/20090619/10/4c62a13b-536b-4b0a-af09-2271c6a104e1.html...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。