虛擬記憶體的問題

2006-11-03 9:40 pm
虛擬記憶體係咩?

回答 (4)

2006-11-03 9:50 pm
✔ 最佳答案
基本的虛擬記憶體概念

現代儲存技術之後所用的科技著實令人印象深刻;但系統管理者不太需要了解這些細節。事實上,系統管理者只要記得一點就夠了:

記憶體永遠不夠!

這句話乍聽之下「笑」果十足;但事實上,作業系統的設計師早已花上許多精力,只為了解決記憶體不足的窘境。這方法就是「虛擬記憶體(virtual memory)」 — 將實際的 RAM 與較慢的硬碟結合起來,讓系統所擁有的記憶體看起來比實際的還多。


虛擬記憶體的兩三事

我們就從一個假設性的應用程式看起。假設這個應用程式的機械碼大小為 10,000 位元組,還需要 5,000 位元組的空間儲存資料與 I/O 緩衝區。這表示這作業系統需要 15,000 位元組的記憶體才能執行;少一個位元組都不行。

這 15,000 位元組就稱為應用程式的「定址空間(address space)」,這是需要容納應用程式與其資料的獨一無二空間大小。在第一批電腦上,記憶體的大小就得比最大的應用程式還大;不然的話,執行這程式就會得到「記憶體不足」的錯誤訊息。

之後的解決方法稱為「覆疊(overlaying)」,能讓程式設計師決定在何時、應用程式的哪一個部份要載入到記憶體中。用這種方式,程式中初始化的部份只要在一開始的時候載入,然後接下來要運行的程式載入時,會覆蓋先前初始化的程式碼,以善用同一塊空間。覆疊功能可以減輕記憶體不足的問題,但這過程非常複雜,又容易出錯。覆疊也沒有辦法解決執行期間,整個系統記憶體不足的問題。換句話說,覆疊的程式所需的記憶體比沒有覆疊的程式要來得少,但如果系統的記憶體比覆疊過後的程式還少,那結果還是一樣的 — 「記憶體不足」。

虛擬記憶體則賦予應用程式的定址空間一個全新的意義:它不在乎應用程式執行時,需要多「多」記憶體;相反地,它不斷的在尋找一個問題:「應用程式執行時,需要多麼『少』的記憶體?」

根據我們假想的應用程式,它需要 15,000 位元組的空間,回想一下第 4.1 節中的討論 — 記憶體存取傾向於循序、發生在鄰近的地點。所以,同一時間內執行這應用程式所需的記憶體數量會低於 15,000 位元組 — 通常要低得多。想想一個執行週期所需要用到的記憶體存取類型:


從記憶體讀取指令。

從記憶體讀取資料。

指令完成後,將結果寫回記憶體。

每次存取所需要的記憶體數量會因為 CPU 的架構、實際指令、以及資料型態而有所不同。然而,即使每個指令存取記憶體時,會用到 100 位元組的記憶體,那麼總共 300 位元組還是遠低於 15,000 位元組的定址空間。如果我們有個方法可以在應用程式執行時,監控程式的記憶體使用量,那麼我們就可以用遠低於定址空間的記憶體,執行這個程式。

但這不禁讓我們想問一個問題:

如果在某個特定時間,應用程式有一部分在記憶體中,那麼其他部份到哪裡去了?


後勤單位 — 虛擬記憶體的最高指導原則

這答案很簡單,應用程式的其他部份都在硬碟上。換句話說,硬碟就像記憶體的「後勤單位」;用空間大、速度慢的儲存媒體,當作速度快、容量小儲存媒體的「備用空間」。乍看之下,這似乎會產生很大的效能問題 — 畢竟硬碟要比記憶體慢得多。

這說的沒錯,但我們可以利用應用程式循序與鄰近的存取模式,讓硬碟太慢的效能問題降到最低。我們可以仔細架構虛擬記憶體子系統,以確保應用程式現在需要的部份 — 或很快就會用到的部份 — 能保存在記憶體中,讓真正需要的時候,立即派得上用場。

這觀念跟快取與主記憶體間的依存關係很像:結合小量的快速儲存空間、以及大量的慢速空間,成為一個看似又快又大的儲存體。
2006-11-03 11:26 pm
虛擬記憶體(virtual memory)」 — 將實際的 RAM 與較慢的硬碟結合起來,讓系統所擁有的記憶體看起來比實際的還多。

虛擬記憶體:詳細情形
首先我們要先介紹一個新概念:虛擬定址空間(virtual address space)。虛擬定址空間指的是應用程式會用到的最大定址空間。虛擬定址空間與系統架構有關,因為虛擬定址空間能用到幾個位元,是由架構所定義的。虛擬定址空間也與作業系統有關,因為它可能會在系統架構之上,加入額外的限制。

虛擬定址空間中的「虛擬」指的是可能會分給這應用程式的總空間,但「不是」安裝在系統中的實體記憶體,或應用程式任何時候可能用到的空間。

以我們剛剛的例子來說,虛擬定址空間為 15,000 位元組。

要製作虛擬記憶體,電腦系統需要有特別的記憶體管理硬體。這硬體通常被稱為記憶體管理單元(MMU,Memory Management Unit)。沒有 MMU 的話,當 CPU 存取記憶體時,實際的記憶體位址永遠不變 — 記憶體位址 123 永遠會在 RAM 的相同位置。

不過有了 MMU 之後,記憶體位址每次存取前,都會先轉譯過。這表示記憶體位址 123 可能一下會被轉到實際位址 82034,之後又被轉到 20468 去。這樣一來,為了追蹤虛擬到實體位置的轉譯過程,就必須監控成千上萬個記憶體位元組,造成極大的效能負荷。所以,MMU 會將記憶體切割成許多分頁(pages) — 連續的記憶體區段,每段的大小相同,並由 MMU 視為一個個獨立的個體。

紀錄這些分頁及分頁的位址轉譯過程聽起來像是多此一舉。但是,虛擬記憶體卻是非用不可的東西。基於這些原因,請想想以下一點。

還是以剛剛擁有 15,000 位元組虛擬定址空間的應用程式來看,假設應用程式的第一道指令就是存取位於位址 12374 的資料;但電腦所擁有的記憶體位址最多只到 12288,那會發生什麼事呢?

這種情況就叫做分頁錯誤(page fault)。

4.4.1. 分頁錯誤
分頁錯誤指的是當程式試圖存取定址空間中的資料(或程式碼)時,這資料(或程式碼)卻不在系統記憶體裡的一連串情形。作業系統必須把資料放到該在的地方,以處理分頁錯誤的問題;同時也讓程式覺得好像分頁錯誤從來沒有發生過一樣。

以我們剛剛的例子來說,CPU 會把想找的資料位址(12374)傳給 MMU;然而 MMU 卻還未轉譯這個位址,只好向處理器發出中斷訊號,以執行稱為分頁錯誤處理程式(page fault handler)的軟體。這軟體會決定如何處理這分頁錯誤的問題。它會:


找出欲存取的分頁在硬碟的哪個地方,將之讀入(在這情況下,讀入的通常會是程式碼)

確定這分頁已經在主記憶體中(但尚未分配給目前的程序),並設定 MMU 指向這分頁

指向一個完全空白(數值為零)的特殊分頁,如果程序試著寫入該分頁,那就分配一個新的分頁給這程序(這稱為「寫入即複製(copy on write)」分頁,通常給初始值全部為零的分頁使用)

從其他地方取得需要的分頁(我們將在稍待一會兒,為您詳細探討)

前面三項都非常的乾脆直接;但最後一項則否。也因此,我們必須為您多做說明。

4.4.2. 工作集
目前指定給某個特定程序的多個實體記憶體分頁,稱之為該程序的「工作集(working set)」。工作集中的分頁數目會因為系統整體的可用分頁多寡,而隨之消長。

當程序發生分頁錯誤時,工作集就會變大;當可用的分頁愈來愈少,工作集就會變小。為了避免記憶體不足,必須從工作集中移除分頁,並標示為可用的分頁,留待稍後使用。作業系統會用以下方法降低工作集的分頁大小:


把一些修改過的分頁寫到硬碟的某個特定區域(通常叫做置換(swapping)或分頁(paging)空間)去

釋出未修改過的分頁(因為資料沒有變動,所以不需要寫入這些分頁)

要為所有的程序決定適當的工作集大小,作業系統必須紀錄所有分頁的使用情形。這樣一來,作業系統就可以知道哪些分頁使用頻繁(所以必須保留在記憶體中),哪些分頁則否(所以可以從記憶體中移除)。在大部分情形下,演算法則會找出最不常用到的分頁,並將這分頁從工作集中移除。

4.4.3. 置換
雖然置換(將修改過的分頁寫到系統置換空間去)是系統運作很正常的一環,但有時置換動作會太過頻繁。我們擔心是因為過度的置換很容易導致以下情況不斷發生:


某個程序的分頁被置換到磁碟上

該程序獲得執行權,並試圖存取剛剛被置換出去的分頁

這分頁被讀回記憶體中(這通常會導致另一個程序的分頁被置換出去)

過了一會兒,這分頁又被置換出去

如果這一連串動作不斷發生,那就稱為 thrashing(猛移;崩潰),表示記憶體的數量不足以支撐目前的工作量。Thrashing 對系統效能有極為負面的影響,因為 CPU 與 I/O 負載會重到影響系統平時的工作。最糟的情形是系統什麼事也不做,只把所有資源都花費在置換分頁上。
2006-11-03 10:05 pm
調整虛擬記憶體,建議不要設定在系統磁碟機
虛擬記憶體相對於實體記憶體而言,是一種作業系統運用的技術,將磁碟空間模擬成記憶體,使得在實體記憶體不足的系統上,也可執行需要記憶體較多的應用程式。通常 Windows 中會將虛擬記憶體的大小調整在實體記憶體的 2.5 倍。

使用虛擬記憶體之優點:
1. 程式不再受到實際記憶體可用空間限制,記憶體可用空間變大。
2. 有更多程式能同時運用記憶體,增加了CPU 使用率。
3. 載入程式或置換程式所須 I/O 次數減少,速度加快。

虛擬記憶體在磁碟內是以「虛擬記憶體交換(置換)檔」存在,Windows 9X 系列中,是 win386.swp 這個檔案,而在 Windows 2000、Windows XP中,則是 pagefiles.sys 這個檔案。Windows 的「虛擬記憶體交換檔」就是拿一部分的硬碟空間來當作記憶體使用,先把一些記憶體中閒置太久的程式,丟到硬碟上,當有需要用到時程式或資料時再從硬碟 win386.swp 或 pagefiles.sys 裡叫回來。

「虛擬記憶體交換檔」並不是用永遠維持固定的大小(除非限制虛擬記憶體大小),執行的應用程式越多,「虛擬記憶體交換檔」也就越大,「虛擬記憶體交換檔」是根據記憶體使用狀況,自動且機動的調整大小。

若要設定虛擬記憶體大小的話,可在桌面上「我的電腦」圖示上,按滑鼠右鍵,點選「內容」→「效能」→「虛擬記憶體」,下圖就是虛擬記憶體的設定畫面。

如果要改變虛擬記憶體的存放位置,可從「磁碟機」方框內選擇要使用的磁碟。如果想要自己設定大小,可調整「起始大小(MB)」及「最大值(MB)」的方 框,填入你想要的初始大小及可使用的最大值,一般最適合的檔案大小值,大約是電腦實體記憶體的 1.5-2 倍左右較合宜。例如:你有 128MB 的實體記憶體,虛擬記憶體最大就可以設為 128 的 1.5 倍,也就是 192MB(起始大小)及 256MB(最大值)是比較恰當的,既不會浪費空間,也不會小到影響系統效能。在調整完後按「設定」,之後重新開機即可。
2006-11-03 9:52 pm
虛擬記憶體 <- 係Virtual Memory
唔係RAM
係用Hard Disk 既位黎扮RAM

如果xp 就係
我的電腦 > Right Click > 內容 > 進階 > 效能 > 設定 > 進階 > 虛擬記憶體 > 變更

虛擬記憶體最多 = Hard Disk容量


收錄日期: 2021-04-12 19:00:25
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20061103000051KK01389

檢視 Wayback Machine 備份