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