2007年7月19日 星期四

深入探索 Windows Vista 核心:第一篇

http://technet.microsoft.com/zh-tw/magazine/2007.02.vistakernel.aspx

‧深入探索 Windows Vista 核心:第一篇

At a Glance:

* 執行緒優先順序和排程
* 檔案架構符號連結
* 取消 I/O 作業



這是有關 Windows Vista 核心新功能一系列文章的第一篇。在這篇文章中,我們要看看處理序、執行緒和 I/O 等方面有哪些改變。未來幾期的文章將涵蓋記憶體管理、啟動和關閉、可靠性和修復及安全性。

本文的範圍只包括對 Windows Vista™ 核心的變更,尤其是 Ntoskrnl.exe 及其密切相關的元件。請記住,Windows Vista 有許多核心以外的其他重要變更不在此討論範圍內。這包括對 Shell (例如整合式桌面搜尋)、網路功能 (如新的 IPv6 堆疊和雙向防火牆) 及下一代繪圖模型 (例如 Aero™ Glass、Windows® Presentation Foundation、桌面視窗管理員和新圖形驅動程式模型) 的改進。此外,新的 Windows 使用者模式和核心模式驅動程式架構 (UMDF 和 KMDF) 也不包括在內,因為這些都可以逆向安裝在舊版 Windows 上。


CPU 循環計數

Windows Vista 增強了部分的處理序和執行緒功能,包括使用 CPU 循環計數器來達到更公平的 CPU 配置,以及新的多媒體類別排程器服務 (Multimedia Class Scheduler Service,MMCSS) 來幫助媒體應用程式呈現無瑕疵播放。

包括 Windows Vista 以下的所有 Windows NT® 設計間隔計時器插斷常式大約每隔 10 或 15 ms (毫秒) 執行一次 (視硬體平台而定)。此常式會檢查它插斷的執行緒並更新該執行緒的 CPU 使用量統計值,就好像該執行緒已執行了整個間隔之久,而實際上該執行緒可能是在該間隔結束之前才開始執行。不僅如此,可能在技術上已指派 CPU 給該執行緒,但因為執行了硬體和軟體插斷常式,反而沒有機會執行該執行緒。

雖然時鐘型時間計量對於報告執行緒和處理序 CPU 使用量的診斷工具而言沒有問題,但執行緒排程器使用該方法會造成不公平的 CPU 配置。在 Windows 的用戶端版本上,預設准許執行緒執行最多 2 個時鐘刻度 (如果是在幕前執行,則為 6 個刻度)。不過,執行緒實際上可能未得到 CPU 任何時間或最多得到 6 個刻度 (如果是在幕前執行,則為 18 個刻度),視它在系統上的行為和其他活動而定)。

[圖 1] 顯示當兩個具有相同優先順序的執行緒同時準備好執行時可能會發生的不公平情況。執行緒 A 會執行到下一個時間配量間隔到期,而排程器卻假設它已執行了整個間隔之久,因而判斷執行緒 A 已執行完畢。不僅如此,讓執行緒 A 負責承擔在輪到它的期間內所發生的插斷,這是不公平的。在下次間隔時,排程器會選擇由執行緒 B 接管,並執行到整個間隔結束為止。

圖 1 不公平的執行緒排程圖 1不公平的執行緒排程

在 Windows Vista,排程器使用現代處理器的循環計數器登錄來準確追蹤一個執行緒執行的 CPU 循環次數。藉由評估 CPU 在一個時鐘間隔內可以執行的循環次數,可以更準確地在 CPU 上進行分配。此外,Windows Vista 排程器不會將執行緒執行期間的插斷執行計算在內。這表示在 Windows Vista 上,執行緒至少會輪到一次 CPU,但絕不會超過一次額外執行的時鐘間隔,以達到更好的公平性及更確定的應用程式行為。[圖 2] 顯示 Windows Vista 提供兩個執行緒至少一個時間配量的執行間隔,以回應 [圖 1] 所顯示的狀況。

圖 2 Windows Vista 循環式排程圖 2 Windows Vista 循環式排程

[監看處理序 CPU 使用量] 資訊看板說明如何使用 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 安裝之後的其中一個工作登錄機碼的內容,不過協力廠商開發人員可以新增自己的工作定義。

圖 3 多媒體類別排程器音訊工作定義

圖 3 多媒體類別排程器音訊工作定義 (Click the image for a larger view)



實作於 %SystemRoot%\System32\Mmcss.dll 中並執行於 Service Host (Svchost.exe) 處理序中的 MMCSS,有一個優先順序管理執行緒是以優先順序 27 執行 (Windows 中的執行緒優先順序範圍是從 0 到 31)。這個執行緒將已登錄的多媒體執行緒優先順序增加到與其工作的登錄機碼的 Scheduling Category 值相關聯的範圍,如 [圖 4] 所列。在 Windows 中,執行緒優先順序 16 以上是在即時優先順序範圍內,高於系統上的所有其他執行緒 (但核心的記憶體管理員工作者執行緒例外,它是以優先順序 28 和 29 執行)。僅系統管理帳戶 (如 MMCSS 執行時所用的本機系統帳戶) 具有「增加優先順序」權限,這是要設定即時執行緒優先順序所需要的權限。





在播放音訊檔時,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 毫秒的期間內增加超過 8 毫秒。為了在剩餘 2 毫秒內擺脫多媒體執行緒,排程器使其優先順序掉到 1-7 範圍。

您可以看看 [監看 MMCSS 優先順序增加] 資訊看板,以了解 MMCSS 如何增加執行緒優先順序。

檔案架構符號連結

Windows Vista I/O 相關變更包括檔案架構符號連結、更有效的 I/O 完成處理、對於 I/O 取消作業的全面支援以及優先順序處理的 I/O。

許多人認為 NTFS 所缺少的一項檔案系統功能 – 符號檔案連結 (或是 UNIX 所謂的暫時連結) – 最後終於出現在 Windows Vista 中。NTFS 的 Windows 2000 版本引進的符號目錄連結叫做目錄連接,它可讓您建立一個指向不同目錄的目錄,但直到 Windows Vista 版本誕生,NTFS 才支援檔案永久連結。

Windows 解析符號連結和目錄連接的方式,其主要差異在於進行處理的位置。Windows 是在本機系統上處理符號連結,即使它們參考遠端檔案伺服器上的位置也一樣。Windows 處理的目錄連接是參考伺服器本身的遠端檔案伺服器。因此,伺服器上的符號連結可以參考只能從用戶端存取的位置,如其他用戶端磁碟區,而目錄連接則不行。為了解決此問題,Windows Vista 同時為檔案和目錄提供新的符號連結類型支援。

許多檔案系統命令已更新,以方便了解符號連結的含意。例如,Delete 命令知道不要遵循連結,以免刪除目標,但會刪除連結本身。不過,由於並非所有應用程式都能夠正確處理符號連結,因此要建立符號連結需要有新的「建立符號連結」權限,預設只有系統管理員才具有此權限。

您可以在命令提示字元中使用 Mklink 命令來建立符號連結。命令提示字元的內建目錄命令識別符號連結的方式是將它標示為 ,並以方括弧顯示目錄,如 [圖 5] 所示。Windows 檔案總管也可以識別符號連結,並以快顯箭號顯示它們。您可以將 [連結目錄] 欄位新增至瀏覽視窗中,即可在檔案總管中看到連結的目錄。

圖 5 使用 Mklink 建立符號連結圖 5 使用 Mklink 建立符號連結 (Click the image for a larger view)

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 和 Explorer 使用的開啟檔案 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。Windows 會等到該處理序的所有 I/O 都已完成或取消之後,才會執行最終處理序清除。在 Windows Vista 中,裝置驅動程式很容易登錄處理序終止的通知,因此大部分無法刪除的處理序問題都能迎刃而解。

I/O 優先順序

雖然 Windows 一向支援 CPU 使用量的優先順序處理,但並未納入 I/O 優先順序的概念。沒有 I/O 優先順序,搜尋檢索、病毒掃描和磁碟重組之類的幕後活動可能嚴重影響幕前作業的回應性。例如,當使用者啟動應用程式或開啟文件時,若有另一項處理序正在執行磁碟 I/O,使用者會發現幕前工作在等待磁碟存取時速度變慢。相同的干擾也會影響硬碟多媒體內容 (如歌曲) 的資料流播放。

Windows Vista 引進兩種類型的 I/O 優先順序處理,以幫助幕前 I/O 作業獲得青睞:個別 I/O 作業和 I/O 頻寬保留的優先順序。Windows Vista I/O 系統內部包括五種 I/O 優先順序的支援,如 [圖 6] 所示,但只使用其中四種優先順序 (未來 Windows 版本可支援 [高] 優先順序)。

I/O 的預設優先順序是 [中],而在低記憶體情況下,記憶體管理員想要將更動過的記憶體資料寫至磁碟時會使用 [緊急] 優先順序,以騰出 RAM 的空間來存放其他資料和程式碼。Windows 工作排程器會將有預設工作優先順序的工作的 I/O 優先順序設為 [低],而針對 Windows Vista 撰寫來執行幕後處理的應用程式所指定的優先順序為 [非常低]。所有 Windows Vista 幕後作業,包括 Windows Defender 掃描和桌面搜尋檢索在內,都使用 [非常低] I/O 優先順序。

系統儲存類別裝置驅動程式 (%SystemRoot%\System32\Classpnp.sys) 會強制執行 I/O 優先順序,因此這些優先順序會自動套用至大部分儲存裝置指示的 I/O。類別和其他儲存驅動程式在其佇列中會將 [中] I/O 插入到 [低] 和 [非常低] 的 I/O 前面,但每秒至少會發出一個等待中的 [低] 或 [非常低] I/O,使幕後處理序能夠有所進展。使用 [非常低] I/O 讀取的資料也會使快取管理員立即將修改寫入磁碟,而不會延後寫入,並且在讀取作業中略過它的預先讀取邏輯,而不會從存取的檔案中預先讀取。請參考 [查看非常低 I/O 優先順序] 資訊看板,其中有關於使用 Process Monitor 公用程式的 [非常低] I/O 優先順序的範例。

Windows Vista 頻寬保留支援對於媒體播放應用程式很有幫助,Windows Media Player 使用它再配合 MMCSS 優先順序的增加,來呈現幾乎無瑕疵的本機內容播放。媒體播放應用程式會要求 I/O 系統保證它有能力在指定的速率下讀取資料,如果裝置可以在所要求的速率下傳遞資料,且現有的頻寬保留也接受的話,它會指導應用程式要在何種速度下發出 I/O 及應該具備的 I/O 大小。除非 I/O 系統可以滿足已在目標儲存裝置上做了保留的應用程式的需求,否則不會為其他 I/O 提供服務。

I/O 系統最後一項值得一提的改變與 I/O 作業的大小有關。從 Windows NT 第一版開始,記憶體管理員和 I/O 系統就把每一個儲存 I/O 要求處理的資料量限制為 64KB。因此,即使應用程式發出更大的 I/O 要求,也會分割成最大大小為 64KB 的個別要求。每一項 I/O 要轉換為核心模式以及在儲存裝置上起始 I/O 轉送時都會招致額外負荷,因此在 Windows Vista 中,不再壓低儲存 I/O 要求大小。有幾個 Windows Vista 使用者模式元件已經過修改,可利用更大 I/O 的支援,包括檔案總管的複製功能及命令提示字元的 Copy 命令,它現在可發出 1MB I/O。

接下來

現在您已經看到 Windows Vista 核心在兩方面的加強。您會在我的著作 Windows Internals (共同執筆者為 David Solomon) 的下一版看到更多深入資訊,此書預定與下一版的 Windows Server (名稱代碼 "Longhorn") 同時發行。在下一期的文章中,我會繼續介紹新核心,討論記憶體管理及系統啟動和關閉。