複製鏈接
請複製以下鏈接發送給好友

預讀

鎖定
預讀是微軟採用的一種加速程序進程啓動速度的技術,主要原理是在開機加載操作系統的時候讀取常用程序的主要內容以備該程序啓動時耗費大量時間來讀取本身的數據。
中文名
預讀
公    司
微軟
類    型
全新系統後台數據預讀機制
特    點
提高系統性能

預讀數據預讀機制

圖1 圖1
微軟採用的一種全新系統後台數據預讀機制,它可以提高系統性能,加快Windows XP/2003的啓動速度,經過預讀的程序全部存放在系統所在文件夾下的prefetch目錄中(圖1),文件名格式類似於下面這個樣子: FOXMAIL.EXE-2B721FDE.pf(這是Foxmail預讀文件)。Windows XP/2003雖然採用了預讀取機制,但是默認設置下比較保守,我們可以自己來定義程序的預讀取方式,大幅度提高系統的性能。

預讀常見問題

在使用Windows XP較長時間後,我們會發現系統運行速度明顯慢了下來,用多優化軟件、卸載已經安裝的軟件都解決不了問題。究竟為什麼呢?原來罪魁禍首就是預讀設置。在 “Windows\Prefetch”文件夾面有很多個以PF為擴展名的文件,這就是預讀文件,如果將裏面的文件清空以後,你就會發現系統運行速度又恢復正常了!看來,預讀設置可以提高系統速度,但是使用一段時間後,預讀文件夾裏的文件又會變得很多了,導致系統搜索花費的時間變得很長。而且有些應用程序會產生死鏈接文件,進而加重了系統搜索的負擔。

預讀解決辦法

因此,我們應該定期刪除這些預讀文件,用以提高開機速度。
當然,Windows XP重新設置預讀對象是允許的。具體方法是:打開註冊表編輯器,依次展開HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters分支,在右側窗口中雙擊“EnablePrefetcher”,在打開的“DWORD”值編輯窗口中,可以對Windows XP進行預讀設置:
將該值設置為“0”,即為取消預讀功能;設置為“1”,系統將只預讀應用程序;設置為“2”,系統將只預讀Windows系統文件;設置為 “3”,系統將預讀Windows系統文件和應用程序。一般我們將該值設置為“2”即可,也可以保留數值數據為默認值即3。這樣可以加快系統運行速度。
prefetch,預存取,這在vista用户可能知道的多些,其實xp下就有這一技術了,只是官方少有這方面介紹,更別提技術文檔了。 這是xp一個隱藏的特性,用處是在xp登錄進度條出現時,就把c:\windows\prefetch目錄下的*.pf文件信息預先裝載到內存中,以便於提高系統性能。這些*.pf文件是系統和應用程序啓動時留下的預存取文件,描述了系統和應用程序每次啓動時裝載模塊的信息和順序,並且其命名方式中包含一個描述其完整路徑的十六進制值。
另外,prefetch目錄中還有一個重要文件,就是layout.ini這個磁盤佈局初始化文件,它記錄了所有預存取程序及文件的加載信息和順序(按優先級排列),這也為這些程序文件的磁盤分配提供了最優化方案的依據。

預讀局部碎片整理

説到這,不得不提一下“局部碎片整理”,按照官方所説,xp每隔3天就會自動進行一次局部碎片整理,我發現這個整理動作是分步實施的,而且是在系統空閒時才會運行,這多虧了剛裝上的SSM截獲了defrag的這個動作信息,連命令行參數都一併截獲,這個重點留待稍後再説。(其實系統在啓動時也可以進行局部碎片整理,使得啓動時需要的文件能夠被整理到相鄰位置,這個功能可以在註冊表中開啓,HKLM\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunetion下enable鍵由默認的N改為Y即可)用Filemon跟蹤發現,系統進行局部碎片整理時,先讀取layout.ini文件,然後調用defrag針對layout.ini中涉及的文件進行整理,然後把轉移信息再寫入到layout.ini中,這個自動整理不同於server2003系統的自動碎片整理功能(Auto Defragmenter)。

預讀開啓預存取

至於是否開啓預存取,有不少爭論,但是我堅決認為應該開啓,否則系統速度會變得更慢。HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters目錄下,EnablePrefeteher子鍵的值決定以何種方式開啓prefetch,0取消,1只預存取應用程序,2只預存取windows系統文件,3同時存取系統和應用程序文件,xp默認情況下是3。以上這些prefetch相關功能依賴於task schedule計劃任務這項服務。

預讀defrag的參數

該説那個重點了,系統自動調用的defrag的參數是什麼?是-p -s和-b。-p後面跟着一個常量,例如5E4;-s後也跟一個常量,比如000018A4;-b後跟着盤符C:,那麼這個命令行的例子就是:defrag.exe -p 5E4 -s 000018A4 -b C: 了。-b這個參數網上一直有傳言,説是defrag的隱藏參數,但是官方不給出澄清,我也不知道是否真的存在,這回算是證實了。-b C:就是對預存取的文件進行局部整理,並且每次僅針對一個pf文件相關程序文件進行整理,-p和-s應該就是用來選擇哪一個pf的,但具體那兩個常量和被選pf文件有什麼聯繫,還有待進一步分析。平時如果想對系統和應用程序文件進行一次優化碎片整理,可以在命令行中敲入defrag.exe C: -b,這樣會對所有prefetch文件進行整理,完成後你會覺得系統的速度有一定提升。

預讀經驗談

經驗之談,如果不小心刪除了prefetch目錄下的文件,尤其是layout.ini文件,如何重建?敲入rundll32.exe advapi32.dll,ProcessIdleTasks命令,然後重啓三次系統,就可以重建layout.ini文件,為什麼是三次,我也不知道,大概和每隔三天整理一次有關係吧。
windowsxp開機有一個進度條,會一遍一遍的跑,不少人認為只跑兩圈就進去的就是開機速度快
網上出現過一種優化方式,修改註冊表將所謂的“開機預讀取”設置為“不預讀”,則可以大大減少進度條“跑”的次數,但是這種“優化方法”出來不久,便有更多的文章指出這是“謬誤”,還舉出相當多的事例,或是試驗,説明不預讀並不能減少開機時間,大多的理由是進度條消失後的“黑屏時間”增加。
因為一直用的休眠,所以我一直也沒怎麼在意。前兩天和別人談到這個問題,我便好好研究一番。
結論是,其實關於這個問題,所謂設置為“不預讀”的優化方法也並非謬誤,而這個所謂的預讀也並非沒有用處,否則MS怎麼也不會花人力物力弄這麼個浪費開機時間的東西。
先説説什麼是所謂的“預讀取”。預讀取分兩種,一種是“系統文件預讀”,一種是“應用程序預讀”。具體的不去討論,只討論預讀取對速度的影響。
我們都有經驗,當第一次打開word的時候會等待比較長的時間,硬盤燈不停的在亮,但是關閉再次打開,word啓動速度就快得多了。這個其實就是windows的預讀取做的優化。windows預讀取發現你帶開了一個他的預讀取數據庫沒有的應用程序時,他就會將這個應用程序中某些信息在內存中留下一個映象,下次打開這個程序就不用再去硬盤上找文件,能大大加塊程序啓動速度
問題來了,內存中的映象重新啓動之後就會消失,下次開機啓動程序依然很慢,怎麼辦呢?這就需要“開機預讀取”功能。Windows會把使用頻率較高的一些應用程序的信息記錄下來,每次開機時,就完成一次對程序的預讀取,從而大大加快應用程序的啓動速度
你大概已經猜到,那個“進度條”一遍一遍的跑的時候,windows就在進行開機預讀取的工作。
因此,如果直接取消掉註冊表中的“預讀取功能”是一定會大大降低應用程序的啓動速度的,當然開機速度會有一定的增加,不過這是得不償失,因為沒有了那一段必要的“系統文件預讀取”,在進度條消失之後系統會從硬盤上去尋找大量的系統文件,反而影響啓動速度,而且應用程序的啓動速度也是一定會大大減慢的。其實比較好的優化辦法是這樣,找到“開機預讀取”的信息,手動把不是很常用,不需要預讀取的應用程序刪除,儘量減少開機預讀取的應用程序的數量,由此來加快啓動速度
位置在x:\windows\prefetch下面,命名是 exe文件名-16進制hash.exe
有一些實測數據,一台裝了許多應用軟件的電腦:
不作處理,開機29s,取消預讀取,開機32s,刪除prefetch文件夾下面大部分文件後,開機23s,有比較明顯的開機速度提升,不過第一次運行應用程序的時候速度的確有所下降,並且prefetch文件夾下文件會自動生成,越來越多!
其中最“有效”的一個文件是NTOSBOOT-B00DFAAD.pf,它可以大大提高Windows的啓動速度。如果只求啓動速度的話,可以只保留這個文件和Layout.ini,然後將Task Scheduler服務設為手動。
當然,要想真正看到預讀效果,必須保證開機後內存佔用小於物理內存量。(比如:開機後從任務管理器看出內存佔用是480MB,而你的物理內存是256MB的,那麼就幾乎看不到預讀的效果。)

預讀微軟網站上的解釋

預讀
除了實時模式Windows 3X所有版本的Windows操作系統需求分頁文件數據和代碼,作為一個應用程序試圖訪問它從磁盤到內存出現故障。數據和代碼在頁面粒狀塊,頁面的大小由CPU的內存管理硬件出現故障。在x86頁是4KB。預取的過程中,從磁盤到內存之前,它的要求將數據和代碼頁。
為了來知道它應該預取什麼,在視窗XP緩存管理監控頁面故障,無論這些要求,數據被讀取磁盤(硬盤故障)和,簡單的要求,已經在內存中的數據被添加到一個進程的工作集(軟故障),發生在引導過程和應用程序啓動。默認情況下,它的痕跡通過的第一個兩個分鐘在引導過程中,60秒時所有的Win32服務已完成初始化,60秒或30秒後用户的外殼(通常為Microsoft Internet Explorer中),讀取這三個事件發生開始的時間後,第一,高速緩存管理器還監視應用程序啓動的前10秒。收集的成NTFS主文件表(MFT)元數據文件(如果該應用程序訪問NTFS捲上的文件或目錄),引用的文件,並引用的目錄,它通知預取組件的任務採取的故障組織一個跟蹤後調度信令命名事件對象。
任務計劃程序然後執行一個調用的內部NtQuerySystemInformation系統調用請求的跟蹤數據。工作排程跟蹤數據進行後期處理後,其寫入到一個文件在\ Windows \ Prefetch文件夾中。文件的名稱是跟蹤到的應用程序適用於後跟一個破折號和一個哈希文件的路徑的十六進制表示。該文件的。粉煤擴展的,所以一個例子是NOTEPAD.EXE AF43252301 .PF。
文件名規則的一個例外是開機的跟蹤,它總是被命名為NTOSBOOT B00DFAAD .PF(卷積的十六進制兼容字BAADF00D的,程序員經常使用來代表未初始化的數據)的文件,該文件存儲。只有在緩存管理器完成開機跟蹤(先前定義時間),它是收集特定的應用程序頁的故障信息。
這個似乎是最影響啓動速度的文件,也就是所謂的“系統文件預讀取”吧
當系統啓動時或在應用程序啓動時,緩存管理器被稱為給它一個機會進行預取。高速緩存管理器看起來在預取目錄,看是否存在一個跟蹤文件預取方案問題。如果是這樣,緩存管理器調用NTFS預取任何MFT元數據文件引用,讀取每個引用的目錄的內容,終於打開每個文件引用。然後,它調用內存管理器讀入的痕跡不是已經在內存中指定的任何數據和代碼。內存管理器啓動所有的異步讀取,然後等待他們完成之前,讓應用程序的啓動繼續。
請問這個方案提供了性能上的好處?答案在於一個事實,即在典型的系統啓動過程中或應用程序啓動時,故障的順序是這樣的贊助商中的某些網頁中從一個文件的一部分,然後從同一文件的另一部分中,那麼從一個不同的頁讀文件,然後將許可從一個目錄,等等。這個結果在周圍移動磁頭在磁盤上跳來跳去。微軟已經學會通過分析,這減慢引導和應用程序啓動時間。通過預取數據從一個文件或目錄之前訪問另一個,這尋求磁盤上的數據,散射的極大地減少或消除,從而提高了整體系統和應用程序啓動時,一次全部。
圖1 Prefetch目錄
為了最大限度地減少尋求更進一步,每三天左右,在系統空閒期間,工作排程組織被引用的順序,在啓動過程或應用程序啓動文件和目錄的列表,以及存儲在一個名為列表\ Windows \ Prefech下\ layout.ini中。圖1示出了一個預取目錄的內容,突出顯示的佈局文件。然後,它會啓動系統的碎片整理命令行選項告訴碎片整理程序來整理文件的內容,而不是執行一個完整的碎片整理的基礎上的。碎片整理程序發現一個連續的區域上存儲每個體積大到足以容納所有上市文件駐留在該捲上的目錄,然後將其移動到該區域的全部,讓他們一前一後。因此,未來的預取操作,甚至是更有效的,因為所有的數據被讀取的信息存儲在磁盤上的物理上的順序,將被讀取。由於通常只有在數百數預取文件碎片整理,碎片整理速度遠遠超過完整的碎片整理。