文章分三部分
第一部分
瞭解 Windows Vista 內核:第一部分
這是系列文章的第一部分,探討的是 Windows Vista 內核中的新增內容。在這一期中,我將著重說明在進程、線程和 I/O 方面的更改;在將來幾期內容中將涉及到內存管理、啟動和關閉、可靠性和恢復以及安全性方面的內容。
本文的範圍僅限於對 Windows Vista 內核的更改,尤其是對 Ntoskrnl.exe 和與其緊密關聯的組件的更改。請記住,在 Windows Vista 中還存在許多其他重大更改,但這些卻超出了內核的範圍,因此本文將不予以說明。其中包括對外殼(如集成的桌面搜索)、網絡(如新的 IPv6 堆棧和雙向防火牆)和下一代圖形模型(如 Aero Glass、Windows Presentation Foundation、桌面窗口管理器和新圖形驅動程序模型)的改進。而且未涉及的內容還包括新的 Windows 用戶模式和內核模式驅動程序框架(UMDF 和 KMDF),因為在較早的 Windows 版本上它們在後級別才是可安裝的。
CPU 時鐘週期計數
Windows Vista 包含了進程和線程方面的大量增強功能,其中包括使用 CPU 時鐘週期計數器以較公平地進行 CPU 分配,以及使用新的多媒體類計劃程序服務 (MMCSS),它有助於媒體應用程序提供穩定的播放。
所有 Windows NT 版本,包括 Windows Vista 程序在內,大約在每 10 ms 或 15 ms(毫秒)執行一次間隔計時器中斷例程,間隔取決於硬件平台。該例程查看它所中斷的線程並更新線程的 CPU 使用統計數據,就好像該線程在整個間隔期間都在運行,而事實上,線程可能僅在間隔就要結束前才開始執行。而且,從技術上講,可能已經為線程分配了 CPU,但卻一直沒有機會運行,因為執行的是硬件和軟件中斷例程。
雖然對於報告線程和進程 CPU 使用情況的診斷工具來說,基於時鐘的時間計算是一個好方法,但是,若由線程計劃程序使用該方法將導致不公平的 CPU 分配。默認情況下,Windows 客戶端版本上的線程最多可運行 2 個時鐘節拍(如果是在前台中運行則為 6 個時鐘節拍)。然而,根據線程在系統上的行為和其他活動,線程實際上可能在 CPU 上根本沒有時間或是最多得到 6 個時鐘節拍(如果是在前台中運行則為 18 個時鐘節拍)。
圖 1 顯示了兩個具有相同優先級的線程同時準備好運行時發生的不公平情況。計劃程序假定線程 A 在整個間隔期間內運行時,線程 A 一直運行到下一時間片間隔過期,因此也就可以確定線程 A 已運行完畢。而且,在線程 A 運行期間發生的中斷應由線程 A 完全負責。在下一間隔內,計劃程序挑選線程 B 來接續,並且要在整個間隔內運行。
圖 1 不公平的線程計劃
在 Windows Vista 中,計劃程序使用現代處理器的時鐘週期計數器寄存器精確地跟蹤線程所執行的 CPU 時鐘週期數。通過估計 CPU 在一個時鐘間隔內能夠執行的時鐘週期數,它可以更準確地在 CPU 上佈置輪循。另外,Windows Vista 計劃程序不會根據線程的輪循計數中斷執行。這就意味著,在 Windows Vista 上,線程始終會得到至少一次在 CPU 上運行的機會,而且永遠不會執行多個額外時鐘間隔,這使應用程序的行為更公平,也更具確定性。圖 2 顯示了 Windows Vista 如何響應圖 1 中所示的情況,方法是為兩個線程提供至少一個時間片的執行間隔。
圖 2 Windows Vista 基於時鐘週期的計劃
「
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
」邊欄說明了用戶如何通過使用 Process Explorer 實用工具監視進程的 CPU 時鐘週期使用情況。
多媒體類計劃程序服務
用戶期望多媒體應用程序(包括音樂和視頻播放器)能夠提供無縫的播放體驗。然而,其他同時運行的應用程序(如防病毒、內容索引甚至是郵件客戶端)對 CPU 的要求會帶來不和諧的因素。為了提供更佳的播放體驗,Windows Vista 引入 MMCSS 來管理多媒體線程的 CPU 優先級。
像 Windows Media Player 11 這樣的多媒體應用程序使用能夠表明其多媒體特性的新 API,通過 MMCSS 進行註冊,它必須與下列按名稱排列的註冊表項之一匹配: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks
各種任務註冊表項可指定與不同多媒體類型相關聯的線程為 CPU 和圖形處理器資源獲取的首選級別(儘管在 Windows Vista 中未實現圖形處理器資源管理)。圖 3 顯示了在乾淨安裝 Windows Vista 後其中一個任務註冊表項的內容,儘管第三方開發人員能夠添加自己的任務定義。
[url=javascript:ToggleImages('338723006', '189403006');]
[/url]
圖 3 多媒體類計劃程序音頻任務定義 (單擊該圖像獲得較小視圖)
[url=javascript:ToggleImages('189403006', '338723006');]
[/url]
圖 3 多媒體類計劃程序音頻任務定義 (單擊該圖像獲得較大視圖)
在 %SystemRoot%\System32\Mmcss.dll 中實現且在服務主機 (Svchost.exe) 進程中運行的 MMCSS 具有可在優先級 27 運行的優先級管理線程。(Windows 中線程優先級的範圍是從 0 到 31。)此線程將已註冊的多媒體線程的優先級推進到另一個範圍內,該範圍與任務註冊表項(如
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
所示)的計劃類別值相關聯。在 Windows 中,線程優先級 16 及更高級別處在實時優先級範圍內並且高於系統上的其他所有線程(除了內核的內存管理器工作線程,該線程在優先級 28 和 29 運行)。僅管理帳戶(如執行 MMCSS 的「本地系統」帳戶)具有設置實時線程優先級所需的提升優先級權限。
在播放音頻文件時,Windows Media Player 註冊音頻任務線程;在播放視頻時,Windows Media Player 註冊播放任務線程。對於已經指明它們在擁有前台窗口的進程中運行時並且在將任務的定義註冊表項中的 BackgroundOnly 值設置為 True 時將同時傳遞流的所有線程,MMCSS 服務會對其進行提升。
但是在 MMCSS 想要幫助多媒體線程獲得所需的 CPU 時間的同時,它還想確保其他線程至少也能獲得一些 CPU 時間,這樣,系統和其他應用程序才能保持響應能力。因此,MMCSS 為其他活動保留了一定百分比的 CPU 時間,並在以下註冊表值中進行指定: HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness
默認情況下,此比例為 20%;MMCSS 監視 CPU 的使用情況,以確保在其他線程需要 CPU 時,在 10 ms 期間內提升多媒體線程所佔的時間不超過 8 ms。為了使多媒體線程不佔用剩下的 2 ms,計劃程序將其優先級設置在 1-7 級的範圍內。
您可以通過閱讀「
訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
」邊欄瞭解 MMCSS 是如何提升線程優先級的。
基於文件的符號鏈接
Windows Vista I/O 的相關更改包括基於文件的符號鏈接、更有效的 I/O 完成處理、對 I/O 取消的全面支持以及優先 I/O。
終於在 Windows Vista 中見到符號文件鏈接(或如在 UNIX 中那樣稱作軟鏈接)了,許多人認為它是 NTFS 中缺少的文件系統功能。NTFS 的 Windows 2000 版本引入了符號目錄鏈接(稱為目錄接合),允許用戶創建指向其他目錄的目錄,但是在 Windows Vista 版本發佈之前,NTFS 僅支持文件的硬鏈接。
Windows 解決符號鏈接和目錄接合所採用的方式的最大區別在於處理所發生的位置。Windows 在本地系統上處理符號鏈接,即使它們引用遠程文件服務器上的位置。Windows 在服務器本身上處理引用遠程文件服務器的目錄接合。因此,服務器上的符號鏈接可以引用僅從客戶端才能訪問的位置(如其他客戶端卷),而目錄接合則做不到。為了解決這個問題,Windows Vista 支持適用於文件和目錄的新符號鏈接類型。
已經對許多文件系統命令進行了更新,以瞭解符號鏈接的含義。例如,Delete 命令知道不要跟隨鏈接(這樣會導致目標的刪除),而是要刪除鏈接。然而,由於不是所有的應用程序都能正確地處理符號鏈接,因此,創建符號鏈接需要新的創建符號鏈接權限,而默認情況下,僅有管理員才具有該權限。
您可以在命令提示符下使用 Mklink 命令創建符號鏈接。命令提示符的內置目錄命令通過用 標記符號鏈接並在括號中顯示目標的方式標識符號鏈接,如圖 5 中所示。Windows 資源管理器也可識別符號鏈接,並使用快捷方式箭頭顯示。可以通過將「鏈接目標」列添加到瀏覽窗口中來查看資源管理器中的鏈接目標。
[url=javascript:ToggleImages('296677008', '175400008');]
[/url]
圖 5 使用 Mklink 創建符號鏈接 (單擊該圖像獲得較小視圖)
[url=javascript:ToggleImages('175400008', '296677008');]
[/url]
圖 5 使用 Mklink 創建符號鏈接 (單擊該圖像獲得較大視圖)
I/O 完成和取消
對 I/O 系統所做的大量更改可改進服務器應用程序的性能。這些應用程序通常使用稱為完成端口的同步對像來等待異步 I/O 請求的完成。在 Windows Vista 之前,當此類 I/O 完成時,已發佈 I/O 的線程將執行 I/O 完成工作,這可切換到線程所屬的進程並中斷所有正在進行的其他工作。然後,I/O 系統將更新完成端口的狀態,以喚醒正在等待完成端口進行狀態更改的線程。
在 Windows Vista 上,I/O 完成處理不必非由已發佈 I/O 的線程執行,但是必須由等待完成端口將其喚醒的線程來執行。這個相對較小的更改避免了不必要的線程計劃以及可能造成應用程序和系統整體性能下降的上下文切換。為了進一步提高性能,服務器可以從一個請求的完成中檢索多個 I/O 操作的結果,避免轉換到內核模式。
從最終用戶的角度來看,I/O 系統中最可見的更改可能是 Windows Vista 所支持的取消同步 I/O 操作。如果曾經執行過 net view 命令或試圖使用 Windows XP 或 Windows Server 2003 訪問過脫機遠程系統的共享,您就已經體驗到了無法取消的 I/O 操作問題:直到網絡超時過期後,命令或文件瀏覽器才能響應。應用程序沒有選擇,只能等待,直至操作失敗,因為它沒有辦法告知正在執行 I/O 的設備驅動程序不需再理會 I/O 了。
在 Windows Vista 中,大多數 I/O 操作都可以取消,包括 Net View 和資源管理器使用的打開文件 I/O。然而,必須更新應用程序以響應最終用戶的取消 I/O 請求,而且許多與具有超時設置的設備進行交互的 Windows Vista 實用工具已得到必要的支持。例如,實際上由每個 Windows 應用程序(包括第三方應用程序)使用的文件打開和保存對話框現在允許在試圖顯示文件夾內容時啟用「取消」按鈕。在按 Ctrl+C 時,Net 命令也可取消其同步 I/O。
可以通過在 Windows Vista 上打開命令提示符並鍵入以下內容來查看 I/O 取消所帶來的好處: net view (\\nonexistentmachine)
在 Windows 試圖聯繫不存在的系統時該命令將掛起,但可以通過鍵入 Ctrl+C 來終止該命令。在 Windows XP 中,Ctrl+C 不會產生影響,並且直到網絡操作超時後命令才會返回。
在 Windows 以前的版本中會引發用戶問題的另一類 I/O 就是設備驅動程序不能正確取消的 I/O,因為設備驅動程序輕易不會知道它們應該這樣做。如果曾經終止過進程,但隨後發現它在進程查看工具中有所延遲,那麼,您已經親眼目睹了設備驅動程序無法對進程終止做出響應,並且取消由未完成進程發佈的 I/O 這兩個過程。直到所有進程的 I/O 已經完成或已被取消,Windows 才能執行最終進程清理。在 Windows Vista 中,設備驅動程序能夠很容易地註冊進程終止的通知,因此,大多數無法終止的進程問題也就迎刃而解了。
[
本帖最後由 midi78578 於 2007-3-4 03:32 編輯 ]