ADVERTISEMENT
倒吃甘蔗的快取策略
前面的重點都是在節省記憶體,然而換個角度想,讓系統裡存在太多的閒置記憶體也浪費,所以還得再加上「快取」,這才是完整的記憶體管理版圖。
3種快取最佳化
快取可從3個方面來進行:延遲抹除分頁、延遲寫入硬碟以及優先載入(預先讀取)可能會用到的資料。延遲抹除的原理很簡單,還記得Standby List及Modified List吧!基本上裡頭的分頁是可以隨時丟棄的,但是Windows會先將它保留在實體記憶體裡,如果程序要再存取時就不必再從硬碟讀1次,不管是從分頁檔還是程式自己的資料檔案。至於延遲寫入的作法就是把要存回硬碟的各種資料先累積在實體記憶體裡,等到達一定體積時再1次寫回硬碟,都是能有效避免頻繁磁碟存取的因應作法。
預先讀取就更容易理解了,既然程序啟動時一定會產生Hard Faults,不如就事先集合產生,不要等到程序要使用時才將硬碟裡的檔案資料載入實體記憶體是快取的設置初衷,等於是預先並統一吸收了之後的零碎檔案載入時間。
打個比方。有些講求周轉率的餐廳會習慣提早準備空桌,避免因為潛在顧客上門時看到客滿而降低消費意願,服務生會提醒已經吃飽的客人們禮讓座位、並對看起來還會點餐的桌次不動聲色。如果還能猜到門外的路人可能會點什麼而提早預熟食材的話,更能有效縮短出餐的等待時間。
觀察快取檔內容
每個程序、包含系統開機時的快取清單都會放在Windows目錄下的Prefetch資料夾裡,並且以.pf做副檔名。如果再使用特殊工具查看,就會知道程序們快取了多少檔案。
值得注意的是,快取的內容有部分是能共享的,比如DLL檔案會載入系統的共享記憶體裡,讓其它程序也能取用。至於其它快取內容會別位於系統工作集的「系統快取」區塊、Standby List及Modified List裡,它們同時也是組成快取記憶體的主要成員。
Prefetcher與SuperFetch
不管是開機、或是執行應用程式時,硬碟讀取頭通常會需要跳躍到不同的地方去存取不同的檔案,或是在1個較大的檔案裡搜索執行時所需要的資料。當應用程式的規模愈大時,這種存取方式所造成的時間流失也就愈重。
為了避免不必要的浪費,通常愈大型的應用程式啟動時讀取進記憶體的資料都只是冰山一角,等到要使用某部分的功能或資料時才會再從硬碟抓取,無形中又增加了不少等待時間。
如果我們能將這些資料先集合起來、供之後開機或執行程式時預先讀取,那麼硬碟就不必那麼辛苦的來往奔波了,而且快取必要的資料並不算是浪費記憶體。Windows在XP之後使用了Prefetcher元件來擔負這個任務,它會偵測每次開機或應用程式啟動時載入了哪些檔案中的哪些區塊,將其記錄到下次的預先載入清單裡,並在有必要時進行區域磁碟重組,藉由「把會讀取到的檔案都先放在一起」並「事先讀進記憶體」,來縮短下次啟動Windows與程式所需花費的時間。
記憶體最佳化
SuperFetch的概念可延伸出不少應用,比如FancyCache、SuperCache及eBoostr之類的第三方軟體,都是主打有更彈性的延遲寫入及預先讀取功能,甚至還能手動選擇要取的程式、並調整其優先權。
設置正確的話,確實能更快的達到理想的加速效果,不必等SuperFetch慢慢學習。Windows本身就有提供函式能讓應用程式調整記憶體裡分頁的優先權,這麼做在作業系統眼裡是合法的,並不是什麼危險的破解動作。
只是別忘了,調高某些程式的優先權、就代表其它程式的優先權會相對降低,如果把全部程式的優先權都調到最高,那麼設置優先權就失去意義了。
SuperFetch預測操作習慣
然而只有Prefetcher並不夠,大家不妨想像以下情況:圖書館裡的公用電腦需要應付各種不同的應用,周一上課的學生要剪接影片、周二上課的學生要寫程式、周三周四周五等等等,每天都可能有不同的軟體被執行,Prefetcher建立的資料隔天就被洗掉,幾乎無用武之地。
Windows Vista引入的「SuperFetch」機制加強了分頁的智慧偵測工作。就預先讀取方面,它會記錄每個程序的執行時間、連帶觸發的其它動作以及使用者的操作習慣,比如在周日晚上載入Photoshop的快取資料來讓玩家修整照片,並且讓Lightroom與Bridge也一併待命。
重整分頁優先權
除了智慧學習使用者行為外,SuperFetch還有個挺厲害的招數:調整Standby List裡的分頁優先權,將「留優汰弱」的延遲寫入(或抹除)精神發揮到極致。
不同於工作集的處理原則,Standby List裡頭的分頁並沒有先來後到之分,而是會依重要性分成0~7不同的8個等級,數字愈大、留在記憶體裡的優先權就愈高。當Windows準備從Standby List抓出分頁抹除時,一定會從優先權低的開始犧牲。
SuperFetch會幫Standby List裡的分頁計算分數,在正確的時間最常被使用到的分頁會擁有較高的分數,偶爾才被取用1次的分頁自然就較低。接著再依分數來指定這些分頁的優先權,優先權為0的分頁會馬上被移除,1~4則是在背景執行的、即使Hard Fault了使用者也較無感的程式,一般程式的分頁優先權會是5,至於6~7基本上是完全不會更動的分頁,除非實體記憶體已經耗盡、完全沒有空白分頁可取用了為止。
所以了,討論0~4的優先權意義不大,5~7才是對效能有決定影響的分頁。一般程式剛執行時優先權都是5,不需要具備什麼特別資格。那麼,什麼樣的程序或資料才能登上Level 6與7呢?
Level 6存放的分頁通常是SuperFetch在學習完成後、認為比一般程式還重要的分頁。基本上,Level 6已經是一般分頁加總分數後所能達到的最高殿堂,因為Level 7存放的是作業系統出廠前就已經由Windows開發人員決定的內容,即使SuperFetch再學習後也不太可能大幅度改變。比如負責「按下開始鈕」、「跳出存檔畫面」、「開啟舊檔」之類動作的程式碼及資料,這是大多數人在進行大部分應用時會出現的操作,沒什麼會比與視窗介面的順暢互動來得重要。
有固態硬碟就別在意
如果玩家們使用的是固態硬碟,快取機制的作用便不是那麼明顯。即使主流RAM再怎樣也比主流SSD快,大部分情況下,你能感受到的落差也只是在測試數字上。Windows 7之後的作業系統會自行評斷磁碟效能來決定是否開啟SuperFetch及相關工具,使用者倒不必擔心因為換裝了更快或較慢的硬碟而是否需手動調整。
大多數玩家在意的可能是SSD的Wearing Level問題。事實上,記憶體快取機制並不會大幅度增加磁碟的寫入負擔(反而還可能會減少),而且Windows在使用SSD時會自動關閉磁碟重組工作。加上私人電腦的使用習慣通常是固定的,不可能每天都進行完全不同的工作,快取工具很快就會確立存取策略及快取檔案的擺放位置,對SSD造成的影響微乎其微。
另外跟快取也有關係的設定是ReadyBoost以及ReadyDrive,在搭配傳統硬碟時,Windows會建議使用隨身碟或混合型硬碟來放置快取資料,因為它們的隨機存取效能較優。如此一來玩家就不必花太多成本來購置大容量RAM或SSD,投資大容量隨身碟反而是更經濟的折衷作法。
ReadyBoost
如果隨身碟的效能符合條件,ReadyBoost服務會在隨身碟根目錄建立一個快取檔,用來攔截硬碟的資料讀寫。
這個快取檔是經過加密且壓縮的,以防有人拔走隨身碟來竊取資料。
(文=RAMBUG)
本文同步刊載於電腦王雜誌
歡迎加入電腦王雜誌粉絲團
一堆人切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 的工作管理員解說圖。
>
> 另外發現錯字:
> "快取工具會快就會確立存取策略" 應該是"很快就會" 吧
感謝指正,也希望這篇文章對你有幫助