3

看了這個問題問了很多次。但找不到合理的答案。實際上虛擬內存的限制是什麼?虛擬內存的最大可尋址空間是多少?

它是CPU的最大可尋址大小嗎?例如,如果CPU是32位,最大值是4G?

另外一些文本將其與硬盤區域相關聯。但我找不到這是一個很好的解釋。有人說它的CPU生成地址。

我們看到的所有地址都是虛擬地址?例如我們在使用GDB調試程序時看到的內存位置。

CPU產生虛擬地址背後的歷史原因是什麼?一些文本可以互換使用虛擬地址和邏輯地址。它有什麼不同?

+0

冷靜下來。也許重讀和重寫你的問題,但可能不會[在某些閱讀]之前(http://en.wikipedia.org/wiki/Virtual_memory)[你自己](http://en.wikipedia.org/wiki/Virtual_address_space )。 –

+0

我會寫出來,但它是很多輸入.... –

回答

7

不幸的是,答案是「這取決於」。你沒有提到一個操作系統,但是當你提到GDB時,你暗示了Linux。我會盡力在我的答案中完全一般。

基本上有三種不同的「地址空間」。

第一個是邏輯地址空間。這是一個指針的範圍。現代(386或更好)具有內存管理單元,允許操作系統使您的實際(物理)內存出現在任意地址。對於典型的臺式機,這是以4KB塊完成的。當一個程序在某個地址訪問內存時,CPU將查找哪個物理地址對應於該邏輯地址,並將其緩存到TLB(轉換後備緩衝區)中。這允許三件事情:首先它允許操作系統爲每個進程提供儘可能多的地址空間(直到指針的整個範圍) - 或者如果有API以允許程序映射/取消映射其地址空間的部分)。其次,它允許它完全隔離不同的程序,通過切換到不同的內存映射,使一個程序無法破壞另一個程序的內存。第三,它爲開發人員提供了一個調試幫助 - 隨機的破壞指針可能指向一些根本沒有被映射的地址,從而導致「分段錯誤」或「無效頁錯誤」或其他,術語因操作系統而異。

第二個地址空間是物理內存。它只是你的RAM - 你有一定數量的RAM。也可能有硬件有內存映射I/O - 看起來像RAM一樣的設備,但它確實是一些硬件設備,如PCI卡,或可能是視頻卡上的內存等。

第三種類型的地址是虛擬地址空間。如果你的物理內存(RAM)比程序所需要的要少,操作系統可以通過給程序帶來大量RAM的錯覺,通過只有一部分實際上是RAM的模擬來模擬更多的RAM,剩下的就是在「交換文件」中。例如,假設你的機器有2MB的RAM。說一個分配4MB的程序。操作系統將會保留4MB的地址空間。操作系統將嘗試在實際的RAM中保留最近/經常訪問的那4MB。任何不經常/最近訪問的部分都被複制到「交換文件」中。現在,如果程序觸及4MB內存中的一部分,CPU將產生「頁面錯誤」。操作系統會查找最近未訪問過的一些物理內存,並在頁面中找到「頁面進入」。在頁面文件能夠訪問被訪問的數據之前,它可能必須將該內存頁面的內容寫入頁面文件。這就是爲什麼它被稱爲交換文件的原因 - 通常,當它從交換文件中讀取某些內容時,它可能必須先寫出一些東西,有效地將內存中的東西與磁盤上的東西交換。典型的MMU(存儲器管理單元)硬件跟蹤哪些地址被訪問(即讀取)和修改(即寫入)。典型的分頁實現通常會在分頁時將數據留在磁盤上。這使得它可以在頁面未被修改時「丟棄」頁面,從而避免在交換時寫出頁面。典型的操作系統會週期性地掃描頁表,並保留某種數據結構,使其能夠智能快速地選擇哪些物理內存未被修改,並隨着時間的推移建立關於內存的哪些部分經常變化以及哪些部分別。

典型的操作系統通常會輕輕地分頁出不經常更改的頁面(因爲他們不想生成太多會干擾實際工作的磁盤I/O)。這允許它在交換操作需要內存時立即丟棄頁面。

典型的操作系統將嘗試使用所有「未使用」的內存空間來「緩存」(保留副本)被訪問的文件。內存比磁盤快數千倍,所以如果經常讀取內容,那麼將其存入RAM中速度會更快。通常情況下,虛擬內存實現將與此「磁盤高速緩存」相結合,作爲可以快速回收交換操作的內存源。

寫一個有效的虛擬內存管理器是非常困難的。它需要動態適應不斷變化的需求。

典型的虛擬內存實現感覺非常慢。當一臺機器開始使用內存更多的RAM時,整體性能會變得非常糟糕。

相關問題