在講虛擬記憶體的時候,還是習慣先說什麼叫記憶體(memory)..

早期的軟體工程師真的非常硬,因為他們可以用的記憶體只有 32 MB(跟現在 C Langue 的 stack size 一樣),所以程式要使用非常多的技巧,如 Stack、折合...等一堆技巧,將程式碼疊了又疊,疊了再疊,疊到最後希望執行的時候能塞到小小的 32MB 的記憶體中。 

階層式記憶體

有念過計概的人都知道什麼叫 "階層式記憶體",就現代而言,速度最快的是 cache(暫存器記憶體,容量約 256K ~ 4MB 不等), 其次是 memory(主記憶體,目前容量1G~4G,4G已算常態),再來是 hard disk (硬碟,這個我實在是沒興趣知道,因為對一般人而言 300 G是常態,而且用不完)。就金字塔階層(愈高階表示愈上層)而言: cache(SRAM) > 主記憶體(DRAM, DDRⅡ...) > 硬碟(SATAⅡ、SATA、IDE....)。其中有幾個關係可以去探討:

(1) 速度: cache > main memory > hard disk
(2) 容量: cache < main memory < hard disk
(3) 單價: cache > main memory > hard disk

cache 與 main memory

我們以開 office word 的例子說明其中的關係。

平時,你的 word 檔案是放在硬碟裡面,當使用者快點二下(或是有其它觸發事件)時,電腦會將該 word 檔從硬碟進行開檔動作,並將其 word 內容 dump 到記憶體裡面去,開完檔案後,接下來你所做的編輯動作都只和 CPU、Memory 有關係,和硬碟沒有關係(如果你沒有設定時存檔的話...)。只有當你編輯完畢之後,電腦才會又將記憶體裡面的資料,再回去存檔給 word,這時候才會又用到硬碟。理論上是這個樣子。

題外話,電腦所有指令裡面,時間花最長的是存檔,再來就是讀檔。

當然,在編輯的過程中,電腦會發現有幾個主記憶體的位址是使用率非常高!但是又嫌主記憶體的速度不夠快,於是,就將常用的記憶體位址抓到 cache 裡面, 同時也產生了 Hit Rate (擊中率) 的概念。所謂的擊中率指的是,CPU先查看要找的記憶體位址有沒有在 cache 裡面,如果有的話就直接去抓 cache 裡的資料(Hit,擊中),如果所需資料不在 cache 裡面(MISS,失誤),那麼就跑到 main memory 裡面,再把 main memory 的資料抓到 cache 裡面去進行讀取。至於造成 cache 的失誤大致上分為三種(3C Miss):強迫性失誤、衝突性失誤、容量性失誤,在此就不再多做贅述。

所以, cache 的容量愈大愈好嗎?

"理論上"而言,並不是愈大愈好。因為 cache 容量大,容易造成強迫性失誤,可能反而使得 Hit Rate 降低,但令人很疑惑的是,目前市面上的電腦都在強調是雙核、強調 L2 cache 有多大,接下來又有一堆數據告訴讀者,L2 cache 增大的話會有怎樣的好處等等之類的。我個人蠻推崇 Patterson&Hennessy 所說的,"小就是快" 這論點。但cache 的確有存在的必要,那要有多少 cache 才能叫做"剛剛好?" 這我倒是蠻困疑的,但我對於一些業者所強調的 "愈大愈好" 這句話保持著懷疑的態度,也由於目前還沒有一個公式,能夠跟各位說:依這台電腦的其它硬體、還有 bench  mark 的測試結果,這台電腦的 cache 應該是要有多大是最佳值,也導致了大家都覺得業者所說的 "愈大愈好" 是對的。

main memory 與 虛擬記憶體

相信不少人早期玩 game 的時候多少有遇到這種狀況發生,|玩到一半的時候,遊戲突然出現:"記憶體不足,程式即將關閉" 之類的對話視窗。那時候上網找只知道說:"把虛擬記憶體加大就好" 之類的。

假設你的記憶體只有 512 MB,但遊戲所需記憶體是 768MB,那你就不能玩遊戲了??OS 有個配套的方案,如果你的記憶體不夠的時候,看你要不要向讀取速度最慢的硬體去借空間,以這個為例,我門大概還要再跟硬碟要個 256MB 才能執行,這樣就有 512MB + 256MB = 768 MB 的空間可以使用了!

~~ 原始上是這樣,實際上 ~~ 太天真。

要知道一件事情, Windows 在一開始的時候,就吃掉了一些記憶體,吃個 150 MB 的記憶體並不為過,剩下約300 MB 的記憶體空間,所以如果向硬碟要空間,只要 256 MB基本上是不夠的。

這種將硬碟當作是主記憶體使用的方式,我們便稱為是虛擬記憶體。通常在程式所需的記憶體比實際可使用記憶體還要大時,便會使用虛擬記憶體,至於虛擬記憶體應該要設多大才好?個人是覺得不一定,當然可以不用的話就不要用!因為虛擬記憶體實際上是在硬體裡面跑,速度和主記憶體差非常多!如果自己的記憶體夠用的話就不要設虛擬記憶體了。而目前有所謂的 Virtual memory monitor 程式,協助監控虛擬記憶體的使用量這樣大致上就能知道虛擬記憶體大概要設多少比較適合了。另外,也有一種說法,虛擬記憶體的最小值設成實體記憶體的 1.5 倍,最大值設成實體記憶體的3倍。

手動設定虛擬記憶的大小

1. 我的電腦 -> 右鍵 -> 內容

2. 切換到 "進階" 標纖,並在 "效能" 那裡按下 "設定"

visual memory - 01.PNG 

3. 切換到 "進階" 標纖,在虛擬記憶體裡面按一下 "變更"

visual memory - 02.PNG 

4. 輸入虛擬記憶體值

 visual memory - 03.PNG

最後再按下確定保存。

pagefile.sys

以上為例,我在電腦 C 槽裡面設了虛擬記憶體,若將資料夾選項改為所有隱藏檔顯示、已知作業系統檔顯示,將會看到 pagefile.sys,按下右鍵 - 內容,可以看到其大小為 864 MB,所以,以後在自己的電腦裡面再看到 pagefile.sys,它就是在硬碟裡面的虛擬記憶體(也有人說是分頁),除非你很明確它是病毒(目前還沒有病毒感染 pagefile.sys 的,應該是檔案讀取權限很高),
否則不要試著去將它刪除,如果嫌它吃你的記憶體空間太大,就算沒有它電腦還跑得動的話,那就考慮關閉使用虛擬記憶體或是將其值改小吧。

 

創作者介紹
創作者 Edison 的頭像
Edison

藍影

Edison 發表在 痞客邦 留言(7) 人氣()


留言列表 (7)

發表留言
  • peiwinds
  • 您好,冒昧問一下
    就階層而言: cache > 主記憶體(DRAM,SRAM, DDRⅡ...) > 硬碟(SATAⅡ、SATA、IDE....)。
    CacheMemory不就是SRAM嗎?
  • 筆誤抱歉,謝謝您的指正

    Edison 於 2009/10/14 16:19 回覆

  • 海洋中的浮木
  • 很喜歡這篇文章~
  • 雖然覺得你可能沒看過, 只是路過無聊留言的, 不過還是謝謝你的稱讚。

    Edison 於 2010/10/12 00:32 回覆

  • 感謝分享
  • 應該是Patterson&Hennessy吧?
  • Computer Organization & Design - The Hardware / Software Interface, David A. Patterson & John L. Hennessy。謝謝您的指正,非常感謝!

    Edison 於 2010/11/09 13:53 回覆

  • cheng
  • 感謝教學
  • 港客
  • 學習了。謝謝~
  • butter80333
  • 您好,這篇文章幫助我很多~~
    想冒昧請問您!
    假如今天下載檔案或者程式是先方在RAM裡,還是DRAM或SRAM?
    那RAM是負責存放甚麼資料的
    很不好意思這樣穩好像有點攏統,但是我看課本和上網找幾乎回答都是
    RAM就是關機後不會保存,DRAM就是主記憶體,SRAM就是快取...
  • 找性伴侶固定長期
  • 課本說的:先將程式載入微電腦的主記憶內 cup再從主記憶體中存取指令 資料執行