Mark Russinovich 是 Microsoft 平臺和服務部門的技術(shù)人員。他是《Microsoft Windows Internals》(Microsoft Windows 內(nèi)部結(jié)構(gòu))(Microsoft Press, 2004) 的合著者之一,并經(jīng)常在 IT 和開發(fā)人員會議上演講。
這是系列文章的第一部分,探討的是 Windows Vista 內(nèi)核中的新增內(nèi)容。在這一期中,將著重說明在進程、線程和 I/O 方面的更改;在將來幾期內(nèi)容中將涉及到內(nèi)存管理、啟動和關閉、可靠性和恢復以及安全性方面的內(nèi)容。
本文的范圍僅限于對 Windows Vista™ 內(nèi)核的更改,尤其是對 Ntoskrnl.exe 和與其緊密關聯(lián)的組件的更改。請記住,在 Windows Vista 中還存在許多其他重大更改,但這些卻超出了內(nèi)核的范圍,因此本文將不予以說明。其中包括對外殼(如集成的桌面搜索)、網(wǎng)絡(如新的 IPv6 堆棧和雙向防火墻)和下一代圖形模型(如 Aero™ Glass、Windows® Presentation Foundation、桌面窗口管理器和新圖形驅(qū)動程序模型)的改進。而且未涉及的內(nèi)容還包括新的 Windows 用戶模式和內(nèi)核模式驅(qū)動程序框架(UMDF 和 KMDF),因為在較早的 Windows 版本上它們在后級別才是可安裝的。
CPU 時鐘周期計數(shù)
Windows Vista 包含了進程和線程方面的大量增強功能,其中包括使用 CPU 時鐘周期計數(shù)器以較公平地進行 CPU 分配,以及使用新的多媒體類計劃程序服務 (MMCSS),它有助于媒體應用程序提供穩(wěn)定的播放。
所有 Windows NT® 版本,包括 Windows Vista 程序在內(nèi),大約在每 10 ms 或 15 ms(毫秒)執(zhí)行一次間隔計時器中斷例程,間隔取決于硬件平臺。該例程查看它所中斷的線程并更新線程的 CPU 使用統(tǒng)計數(shù)據(jù),就好像該線程在整個間隔期間都在運行,而事實上,線程可能僅在間隔就要結(jié)束前才開始執(zhí)行。而且,從技術(shù)上講,可能已經(jīng)為線程分配了 CPU,但卻一直沒有機會運行,因為執(zhí)行的是硬件和軟件中斷例程。
雖然對于報告線程和進程 CPU 使用情況的診斷工具來說,基于時鐘的時間計算是一個好方法,但是,若由線程計劃程序使用該方法將導致不公平的 CPU 分配。默認情況下,Windows 客戶端版本上的線程最多可運行 2 個時鐘節(jié)拍(如果是在前臺中運行則為 6 個時鐘節(jié)拍)。然而,根據(jù)線程在系統(tǒng)上的行為和其他活動,線程實際上可能在 CPU 上根本沒有時間或是最多得到 6 個時鐘節(jié)拍(如果是在前臺中運行則為 18 個時鐘節(jié)拍)。
兩個具有相同優(yōu)先級的線程同時準備好運行時發(fā)生的不公平情況。計劃程序假定線程 A 在整個間隔期間內(nèi)運行時,線程 A 一直運行到下一時間片間隔過期,因此也就可以確定線程 A 已運行完畢。而且,在線程 A 運行期間發(fā)生的中斷應由線程 A 完全負責。在下一間隔內(nèi),計劃程序挑選線程 B 來接續(xù),并且要在整個間隔內(nèi)運行。
在 Windows Vista 中,計劃程序使用現(xiàn)代處理器的時鐘周期計數(shù)器寄存器精確地跟蹤線程所執(zhí)行的 CPU 時鐘周期數(shù)。通過估計 CPU 在一個時鐘間隔內(nèi)能夠執(zhí)行的時鐘周期數(shù),它可以更準確地在 CPU 上布置輪循。另外,Windows Vista 計劃程序不會根據(jù)線程的輪循計數(shù)中斷執(zhí)行。這就意味著,在 Windows Vista 上,線程始終會得到至少一次在 CPU 上運行的機會,而且永遠不會執(zhí)行多個額外時鐘間隔,這使應用程序的行為更公平,也更具確定性。 方法是為兩個線程提供至少一個時間片的執(zhí)行間隔。
“查看進程的 CPU 使用情況”邊欄說明了用戶如何通過使用 Process Explorer 實用工具監(jiān)視進程的 CPU 時鐘周期使用情況。
多媒體類計劃程序服務
用戶期望多媒體應用程序(包括音樂和視頻播放器)能夠提供無縫的播放體驗。然而,其他同時運行的應用程序(如防病毒、內(nèi)容索引甚至是郵件客戶端)對 CPU 的要求會帶來不和諧的因素。為了提供更佳的播放體驗,Windows Vista 引入 MMCSS 來管理多媒體線程的 CPU 優(yōu)先級。
像 Windows Media® Player 11 這樣的多媒體應用程序使用能夠表明其多媒體特性的新 API,通過 MMCSS 進行注冊,它必須與下列按名稱排列的注冊表項之一匹配: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks
各種任務注冊表項可指定與不同多媒體類型相關聯(lián)的線程為 CPU 和圖形處理器資源獲取的首選級別(盡管在 Windows Vista 中未實現(xiàn)圖形處理器資源管理)。顯示了在干凈安裝 Windows Vista 后其中一個任務注冊表項的內(nèi)容,盡管第三方開發(fā)人員能夠添加自己的任務定義。
在 %SystemRoot%\System32\Mmcss.dll 中實現(xiàn)且在服務主機 (Svchost.exe) 進程中運行的 MMCSS 具有可在優(yōu)先級 27 運行的優(yōu)先級管理線程。(Windows 中線程優(yōu)先級的范圍是從 0 到 31。)此線程將已注冊的多媒體線程的優(yōu)先級推進到另一個范圍內(nèi),該范圍與任務注冊表項的計劃類別值相關聯(lián)。在 Windows 中,線程優(yōu)先級 16 及更高級別處在實時優(yōu)先級范圍內(nèi)并且高于系統(tǒng)上的其他所有線程(除了內(nèi)核的內(nèi)存管理器工作線程,該線程在優(yōu)先級 28 和 29 運行)。僅管理帳戶(如執(zhí)行 MMCSS 的“本地系統(tǒng)”帳戶)具有設置實時線程優(yōu)先級所需的提升優(yōu)先級權(quán)限。
在播放音頻文件時,Windows Media Player 注冊音頻任務線程;在播放視頻時,Windows Media Player 注冊播放任務線程。對于已經(jīng)指明它們在擁有前臺窗口的進程中運行時并且在將任務的定義注冊表項中的 BackgroundOnly 值設置為 True 時將同時傳遞流的所有線程,MMCSS 服務會對其進行提升。
但是在 MMCSS 想要幫助多媒體線程獲得所需的 CPU 時間的同時,它還想確保其他線程至少也能獲得一些 CPU 時間,這樣,系統(tǒng)和其他應用程序才能保持響應能力。因此,MMCSS 為其他活動保留了一定百分比的 CPU 時間,并在以下注冊表值中進行指定: HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness
默認情況下,此比例為 20%;MMCSS 監(jiān)視 CPU 的使用情況,以確保在其他線程需要 CPU 時,在 10 ms 期間內(nèi)提升多媒體線程所占的時間不超過 8 ms。為了使多媒體線程不占用剩下的 2 ms,計劃程序?qū)⑵鋬?yōu)先級設置在 1-7 級的范圍內(nèi)。
您可以通過閱讀“查看 MMCSS 優(yōu)先級提升”邊欄了解 MMCSS 是如何提升線程優(yōu)先級的。
這是系列文章的第一部分,探討的是 Windows Vista 內(nèi)核中的新增內(nèi)容。在這一期中,將著重說明在進程、線程和 I/O 方面的更改;在將來幾期內(nèi)容中將涉及到內(nèi)存管理、啟動和關閉、可靠性和恢復以及安全性方面的內(nèi)容。
本文的范圍僅限于對 Windows Vista™ 內(nèi)核的更改,尤其是對 Ntoskrnl.exe 和與其緊密關聯(lián)的組件的更改。請記住,在 Windows Vista 中還存在許多其他重大更改,但這些卻超出了內(nèi)核的范圍,因此本文將不予以說明。其中包括對外殼(如集成的桌面搜索)、網(wǎng)絡(如新的 IPv6 堆棧和雙向防火墻)和下一代圖形模型(如 Aero™ Glass、Windows® Presentation Foundation、桌面窗口管理器和新圖形驅(qū)動程序模型)的改進。而且未涉及的內(nèi)容還包括新的 Windows 用戶模式和內(nèi)核模式驅(qū)動程序框架(UMDF 和 KMDF),因為在較早的 Windows 版本上它們在后級別才是可安裝的。
CPU 時鐘周期計數(shù)
Windows Vista 包含了進程和線程方面的大量增強功能,其中包括使用 CPU 時鐘周期計數(shù)器以較公平地進行 CPU 分配,以及使用新的多媒體類計劃程序服務 (MMCSS),它有助于媒體應用程序提供穩(wěn)定的播放。
所有 Windows NT® 版本,包括 Windows Vista 程序在內(nèi),大約在每 10 ms 或 15 ms(毫秒)執(zhí)行一次間隔計時器中斷例程,間隔取決于硬件平臺。該例程查看它所中斷的線程并更新線程的 CPU 使用統(tǒng)計數(shù)據(jù),就好像該線程在整個間隔期間都在運行,而事實上,線程可能僅在間隔就要結(jié)束前才開始執(zhí)行。而且,從技術(shù)上講,可能已經(jīng)為線程分配了 CPU,但卻一直沒有機會運行,因為執(zhí)行的是硬件和軟件中斷例程。
雖然對于報告線程和進程 CPU 使用情況的診斷工具來說,基于時鐘的時間計算是一個好方法,但是,若由線程計劃程序使用該方法將導致不公平的 CPU 分配。默認情況下,Windows 客戶端版本上的線程最多可運行 2 個時鐘節(jié)拍(如果是在前臺中運行則為 6 個時鐘節(jié)拍)。然而,根據(jù)線程在系統(tǒng)上的行為和其他活動,線程實際上可能在 CPU 上根本沒有時間或是最多得到 6 個時鐘節(jié)拍(如果是在前臺中運行則為 18 個時鐘節(jié)拍)。
兩個具有相同優(yōu)先級的線程同時準備好運行時發(fā)生的不公平情況。計劃程序假定線程 A 在整個間隔期間內(nèi)運行時,線程 A 一直運行到下一時間片間隔過期,因此也就可以確定線程 A 已運行完畢。而且,在線程 A 運行期間發(fā)生的中斷應由線程 A 完全負責。在下一間隔內(nèi),計劃程序挑選線程 B 來接續(xù),并且要在整個間隔內(nèi)運行。
在 Windows Vista 中,計劃程序使用現(xiàn)代處理器的時鐘周期計數(shù)器寄存器精確地跟蹤線程所執(zhí)行的 CPU 時鐘周期數(shù)。通過估計 CPU 在一個時鐘間隔內(nèi)能夠執(zhí)行的時鐘周期數(shù),它可以更準確地在 CPU 上布置輪循。另外,Windows Vista 計劃程序不會根據(jù)線程的輪循計數(shù)中斷執(zhí)行。這就意味著,在 Windows Vista 上,線程始終會得到至少一次在 CPU 上運行的機會,而且永遠不會執(zhí)行多個額外時鐘間隔,這使應用程序的行為更公平,也更具確定性。 方法是為兩個線程提供至少一個時間片的執(zhí)行間隔。
“查看進程的 CPU 使用情況”邊欄說明了用戶如何通過使用 Process Explorer 實用工具監(jiān)視進程的 CPU 時鐘周期使用情況。
多媒體類計劃程序服務
用戶期望多媒體應用程序(包括音樂和視頻播放器)能夠提供無縫的播放體驗。然而,其他同時運行的應用程序(如防病毒、內(nèi)容索引甚至是郵件客戶端)對 CPU 的要求會帶來不和諧的因素。為了提供更佳的播放體驗,Windows Vista 引入 MMCSS 來管理多媒體線程的 CPU 優(yōu)先級。
像 Windows Media® Player 11 這樣的多媒體應用程序使用能夠表明其多媒體特性的新 API,通過 MMCSS 進行注冊,它必須與下列按名稱排列的注冊表項之一匹配: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks
各種任務注冊表項可指定與不同多媒體類型相關聯(lián)的線程為 CPU 和圖形處理器資源獲取的首選級別(盡管在 Windows Vista 中未實現(xiàn)圖形處理器資源管理)。顯示了在干凈安裝 Windows Vista 后其中一個任務注冊表項的內(nèi)容,盡管第三方開發(fā)人員能夠添加自己的任務定義。
在 %SystemRoot%\System32\Mmcss.dll 中實現(xiàn)且在服務主機 (Svchost.exe) 進程中運行的 MMCSS 具有可在優(yōu)先級 27 運行的優(yōu)先級管理線程。(Windows 中線程優(yōu)先級的范圍是從 0 到 31。)此線程將已注冊的多媒體線程的優(yōu)先級推進到另一個范圍內(nèi),該范圍與任務注冊表項的計劃類別值相關聯(lián)。在 Windows 中,線程優(yōu)先級 16 及更高級別處在實時優(yōu)先級范圍內(nèi)并且高于系統(tǒng)上的其他所有線程(除了內(nèi)核的內(nèi)存管理器工作線程,該線程在優(yōu)先級 28 和 29 運行)。僅管理帳戶(如執(zhí)行 MMCSS 的“本地系統(tǒng)”帳戶)具有設置實時線程優(yōu)先級所需的提升優(yōu)先級權(quán)限。
在播放音頻文件時,Windows Media Player 注冊音頻任務線程;在播放視頻時,Windows Media Player 注冊播放任務線程。對于已經(jīng)指明它們在擁有前臺窗口的進程中運行時并且在將任務的定義注冊表項中的 BackgroundOnly 值設置為 True 時將同時傳遞流的所有線程,MMCSS 服務會對其進行提升。
但是在 MMCSS 想要幫助多媒體線程獲得所需的 CPU 時間的同時,它還想確保其他線程至少也能獲得一些 CPU 時間,這樣,系統(tǒng)和其他應用程序才能保持響應能力。因此,MMCSS 為其他活動保留了一定百分比的 CPU 時間,并在以下注冊表值中進行指定: HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness
默認情況下,此比例為 20%;MMCSS 監(jiān)視 CPU 的使用情況,以確保在其他線程需要 CPU 時,在 10 ms 期間內(nèi)提升多媒體線程所占的時間不超過 8 ms。為了使多媒體線程不占用剩下的 2 ms,計劃程序?qū)⑵鋬?yōu)先級設置在 1-7 級的范圍內(nèi)。
您可以通過閱讀“查看 MMCSS 優(yōu)先級提升”邊欄了解 MMCSS 是如何提升線程優(yōu)先級的。