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頻率,也就是圖中的「硬性錯誤」。
若是某個程序的硬性錯誤頻率特別高,就代表該程序一直得不到充足的記憶體,這時候使用者……其實也沒辦法做些什麼,就只能選擇先關閉其它程序來挪出空間、或是加大實體記憶體容量。
通常前者並不會有太大幫助,因為操作中的、在前景的程序通常已經擁有最高的記憶體使用優先權,閒置的程式分頁早就被打入硬碟或抹除了,關閉它們未必會釋放出多少實體記憶體空間。
(後面還有:正確解讀記憶體佔用率)
一堆人切RAMDisk把分頁檔丟進去真的不知道在想什麼...
已把分頁檔從RAMDisk移出了~
我把剩下的5G作成RAMDISK 其中4G拿來當作虛擬記憶體
1G拿來放網頁暫存檔
雖然不是念這科的 但還是硬是讀懂了
文字敘述說明很清楚 但"分頁清單分類圖"本身不是很好看懂
(≧▽≦)(≧▽≦)(≧▽≦)(≧▽≦)(≧▽≦)
給予此文本站最高評價 5個(≧▽≦)
其實也不太需要ReadyBoost
除非你主機板與隨身碟支援USB3.0
文中所說的 Modified List 不是可以隨時丟回工作集嗎?
為何又說必須要存進磁碟才能回存工作集...
Modified List是抹除前才有需要進行寫入磁碟動作,
那如果馬上要,還要寫入在讀取一次?
還有工作管理員我看了半天又拿出計算機按了一下。
總算明白 可用的=待命=STNANDBY,然後待命(快取)+
實體記憶體使用量=系統對記憶體的使用量。
http://bbs.pceva.com.cn/thread-35083-1-1.html
另外發現錯字:
"快取工具會快就會確立存取策略" 應該是"很快就會" 吧
> 專業大推~~! 用電腦這麼久了,現在終於知道工作管理員裡記憶體這幾項的差別了。不過希望有 Windows 7 的工作管理員解說圖。
>
> 另外發現錯字:
> "快取工具會快就會確立存取策略" 應該是"很快就會" 吧
感謝指正,也希望這篇文章對你有幫助