想讓電腦更快更順嗎?系統最佳化,深入Windows記憶體管理

ADVERTISEMENT

轉址為Page Fault之母

程式透過作業系統要存取記憶體時,會經過很多道步驟來查詢並把虛擬轉譯成實體位址,其中的過程十分複雜。簡單的說,系統如果判斷這是1次有效的存取,那麼此要求便成立;如果是無效的,就會產生「Page Fault」。

Page Fault產生的原因及應變方式很多,除了真正的硬體損壞或軟體錯誤,我們可以將其解釋成「程序嘗試存取不在它工作集裡的分頁」。套用到前文所提的分頁生命周期,比較常見的情況會發生在程序要存取以下幾種分頁時:

空白分頁

這種情況會出現在剛執行或需要更多空白分頁時。這時候因為虛擬位址並沒有對應到實體位址,記憶體管理員會挪出空白分頁(不管是跑1次回收流程或取用本來就還有的分頁),並將其實體位址與虛擬位址掛勾。

流浪分頁

因為這個分頁已經不屬於該程序的工作集,只是還沒被抹除而已,比如Modified List或Standby List裡的分頁。記憶體管理員會把此分頁的所有權重掛回原程序的工作集裡,fault的意義只存在於分頁的歸屬上。

硬碟分頁

同流浪分頁的處理方式,但是要先從分頁檔裡讀出資料,然後再跑1次空白分頁與流浪分頁的處理流程。

Fault

Fault聽起來好像是很負面的字眼,然而它是維持記憶體運作效率的必要手段。除了少數情況是記憶體在軟體或硬體上確實產生損壞,不然Page Fault指的是存取到無效分頁以及之後的處理方式,在時態上有雙重涵義。

至於無效分頁的判定理由有很多種,存取一個已經不在工作集裡的分頁也是一種Page Fault,因為程序本身並不會知道它要存取的分頁已經被踢出工作集了,該虛擬位址對應到的實體分頁已不屬它用。

效能殺手Hard Fault

不管是取得空白分頁、或是取回原本在外流浪的分頁,只要是能在實體記憶體裡完成的,都是對系統效能幾乎無影響的「Soft Fault」。相反的,這些分頁如果已經寫入硬碟了,那麼就得從硬碟讀出並放到空白分頁裡,再回到程序的工作集。從硬碟存取分頁容易產生程序的「硬直」時間,一般稱之為「Hard Fault」。

Hard Faults在寫入動作上是循序的,加上寫入動作多是在記憶體壓力不大的背景下執行,所以對效能的影響較小。讀取時間才是最大的致命傷,重點不在資料量,而是反應時間,使用快寫策略的結果就是讓分頁檔裡的資料失去連續性,同一個程序的分頁在分頁檔裡的分佈可能極為零散,剛好中了傳統硬碟的罩門。

用快取平衡壓力

該如何減少產生Hard Faults,可以藉由「快取」來平衡硬碟讀寫與記憶體間的壓力,我們在稍後的篇幅會提到。針對分頁檔而言,在記憶體不足時過度依賴它同樣會造成大量的Hard Faults,對系統效能的衝擊不可小覷。比如:明明需要4GB的記憶體、卻只靠1GB的RAM在硬撐,就算分頁檔設再大也很難挽回系統穩定性及效能。

單純只靠分頁檔來撐的話,Windows早在耗盡實體記憶體前就會逼迫Modified Page Writer一直將分頁寫入硬碟,工作一多,Hard Faults不斷地連帶引發後續更多的Hard Faults(因為上一個fault而被寫入硬碟的分頁要再觸發下一個fault才能被存回實體記憶體,最明顯的狀況是應用程式的切換會變很慢),於是系統就掉入無間地獄裡。

假設某個程序裡的資料等待時間是寫死的5毫秒,結果因為硬碟緩慢而繁重的Hard Faults導致在此時間內讀不到完整資料而產生例外(Exception),例外處理機制完善的程式會發出錯誤訊息,差一點的就自己崩潰、甚至連帶影響其它程式也不無可能。

例外(Exception)

程序在執行時會依不同的條件判斷接下來的處理方式,比如發生狀況A就執行方法一、發生狀況B就執行方法二等等。如果產生了程序意料外的狀況,就是「例外」。較完善的系統或程序會有比較可靠的例外處理機制,比如「以上條件都不符合的話就執行例外解決方案」。如果沒有例外處理機制的話,很可能就會當機或遺失資料。

Hard Faults無可避免

儘管如此,玩家們倒不必因噎廢食,因為不設置分頁檔也會存在一定風險。在無法把分頁寫入硬碟的情況下,Modified Pages可能會變得比較多,間接造成了可用的Standby Pages會變少,你在工作管理員裡看到的「可用空間」會比啟用了分頁檔的環境小,儘管執行的工作量是一樣的。

如果實體記憶體夠大,那麼還有很多Zero Pages可以用,就不構成威脅。相反的,假如實體記憶體快用完了,Modified Pages又無法寫入硬碟,很可能會造成資料遺失。比如開著Word打100字還沒問題,再多打1個字就當機了。

除此之外,即使關閉了分頁檔,並不代表系統就完全不會產生Hard Faults。程序在剛執行時一定會產生Hard Fault,因為它要從硬碟裡讀出資料,而且有些Modified Pages還是得寫回程序自己的資料檔案裡,我們能做的只是「盡量減少」而不是「完全關閉」Hard Faults,除非打算讓系統在唯讀狀態下運行,那就是另外一回事。

我們不太容易知道分頁檔裡有多少空間已經被使用了,但是可以從工作管理員看到每個程序的Hard Fault頻率,也就是圖中的「硬性錯誤」。 

若是某個程序的硬性錯誤頻率特別高,就代表該程序一直得不到充足的記憶體,這時候使用者……其實也沒辦法做些什麼,就只能選擇先關閉其它程序來挪出空間、或是加大實體記憶體容量。

通常前者並不會有太大幫助,因為操作中的、在前景的程序通常已經擁有最高的記憶體使用優先權,閒置的程式分頁早就被打入硬碟或抹除了,關閉它們未必會釋放出多少實體記憶體空間。

想讓電腦更快更順嗎?系統最佳化,深入Windows記憶體管理

(後面還有:正確解讀記憶體佔用率)

魯蛇實驗室
作者

戶田惠梨香 新垣結衣 長澤雅美 吉高由里子 志田未來 北川景子 香里奈 竹內結子 北乃紀伊 菅野美穗 黑川智花 宮崎葵 夏帆 貫地谷詩穗梨 石原里美 有村架純 井上真央 真野恵里菜 能年玲奈 深田恭子

使用 Facebook 留言
悶燒貢丸
1人給推

1.  悶燒貢丸 (發表於 2013年7月26日 09:37)
難得的頗有深度 有提出具體理論 非常值得參考的文章

一堆人切RAMDisk把分頁檔丟進去真的不知道在想什麼...
帥氣小貝
1人給推

3.  帥氣小貝 (發表於 2013年7月26日 12:06)
我是還在用XP作業系統 8G記憶體只能使用到3G

我把剩下的5G作成RAMDISK 其中4G拿來當作虛擬記憶體

1G拿來放網頁暫存檔
PCABC
3人給推

4.  PCABC (發表於 2013年7月26日 12:08)
寫的真棒 還更改了我過去的許多觀念

雖然不是念這科的 但還是硬是讀懂了

文字敘述說明很清楚 但"分頁清單分類圖"本身不是很好看懂

(≧▽≦)(≧▽≦)(≧▽≦)(≧▽≦)(≧▽≦)

給予此文本站最高評價 5個(≧▽≦)
Liger-Zero
6.  Liger-Zero (發表於 2013年7月27日 08:36)
我裝了assrock xram的軟體後把甚麼可掉到ramdisk的選項都掉到ramdisk了去, 結果系統越用越慢又不穩定, 不到半年便重灌, 現在除了cache檔和temp檔, 不敢亂掉東西到ramdisk了
無痕
7.  無痕 (發表於 2013年7月30日 10:17)
看完了,這邊我有個疑問;
文中所說的 Modified List 不是可以隨時丟回工作集嗎?
為何又說必須要存進磁碟才能回存工作集...
Modified List是抹除前才有需要進行寫入磁碟動作,
那如果馬上要,還要寫入在讀取一次?

還有工作管理員我看了半天又拿出計算機按了一下。
總算明白 可用的=待命=STNANDBY,然後待命(快取)+
實體記憶體使用量=系統對記憶體的使用量。
稚空
9.  稚空 (發表於 2014年1月17日 18:24)
專業大推~~! 用電腦這麼久了,現在終於知道工作管理員裡記憶體這幾項的差別了。不過希望有 Windows 7 的工作管理員解說圖。

另外發現錯字:
"快取工具會快就會確立存取策略" 應該是"很快就會" 吧
魯蛇實驗室
10.  魯蛇實驗室 (發表於 2014年1月17日 18:48)
※ 引述《稚空》的留言:
> 專業大推~~! 用電腦這麼久了,現在終於知道工作管理員裡記憶體這幾項的差別了。不過希望有 Windows 7 的工作管理員解說圖。
>
> 另外發現錯字:
> "快取工具會快就會確立存取策略" 應該是"很快就會" 吧

感謝指正,也希望這篇文章對你有幫助
發表回應
謹慎發言,尊重彼此。按此展開留言規則