2013.07.26 09:05

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

ADVERTISEMENT

轉址為Page Fault之母

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

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

空白分頁

ADVERTISEMENT

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

流浪分頁

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

ADVERTISEMENT

硬碟分頁

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

Fault

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

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

效能殺手Hard Fault

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

ADVERTISEMENT

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

用快取平衡壓力

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

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

ADVERTISEMENT

假設某個程序裡的資料等待時間是寫死的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頻率,也就是圖中的「硬性錯誤」。 

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

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

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

ADVERTISEMENT

這裡可以買:http://www.chinesean.com/affiliate/clickBanner.do?wId=54967&pId=11857&cId=20045