上個(gè)月,我在這個(gè)由三部分構(gòu)成的系列文章的第一部分,分析了 Windows Vista 內(nèi)核在進(jìn)程和 I/O 方面的增強(qiáng)功能。 這一次,我將涵蓋到 Windows Vista 對內(nèi)存管理方式的提升以及系統(tǒng)啟動(dòng)、關(guān)閉和電源管理方面的主要改進(jìn)(第 1 部分)。 Windows? 隨著每個(gè)發(fā)行版本的問世都在可伸縮性和性能方面進(jìn)行了改進(jìn),Windows Vista? 也不例外。Windows Vista 內(nèi)存管理器包含了大量增強(qiáng)功能,例如,更大范圍地使用無鎖同步技術(shù)、鎖定粒度更細(xì)、數(shù)據(jù)結(jié)構(gòu)包更緊密,分頁 I/O 更大、增加了對現(xiàn)代 GPU 內(nèi)存體系結(jié)構(gòu)的支持,并更有效利用了硬件的轉(zhuǎn)換旁路緩沖器。另外,Windows Vista 內(nèi)存管理如今還針對不同工作負(fù)荷的要求提供動(dòng)態(tài)地址空間分配。 以下四種采用新技術(shù)的性能增強(qiáng)型功能首次在 Windows Vista 操作系統(tǒng)上登臺(tái)亮相:SuperFetch、ReadyBoost、ReadyBoot 和 ReadyDrive。本文稍后將詳細(xì)討論這些功能。 動(dòng)態(tài)內(nèi)核地址空間 Windows 以及其上所運(yùn)行的應(yīng)用程序占用的地址空間已經(jīng)達(dá)到了 32 位處理器的地址空間極限。默認(rèn)情況下,Windows 內(nèi)核被限制在 2GB,或者是 32 位虛擬地址空間總量的一半,另一半則預(yù)留給當(dāng)前正在 CPU 中運(yùn)行線程的進(jìn)程使用。在其自己的那一半虛擬地址空間中,內(nèi)核必須映射其自身、設(shè)備驅(qū)動(dòng)程序、文件系統(tǒng)緩存、內(nèi)核堆棧、每會(huì)話代碼數(shù)據(jù)結(jié)構(gòu),以及由設(shè)備驅(qū)動(dòng)程序分配的非分頁(鎖定的物理內(nèi)存)緩沖區(qū)和分頁緩沖區(qū)。在 Windows Vista 推出之前,內(nèi)存管理器在引導(dǎo)時(shí)確定針對這些用途分配多少地址空間,但這種不變性有時(shí)會(huì)造成其中某一區(qū)域空間被占滿,而其他區(qū)域仍有大量可用空間的情況。區(qū)域空間被用盡會(huì)導(dǎo)致應(yīng)用程序出現(xiàn)故障,并會(huì)妨礙設(shè)備驅(qū)動(dòng)程序完成 I/O 操作。 在 32 位 Windows Vista 中,內(nèi)存管理器動(dòng)態(tài)管理內(nèi)核的地址空間,根據(jù)工作負(fù)荷的具體需求為各種用途分配和釋放空間。這樣,用于存儲(chǔ)分頁緩沖區(qū)的虛擬內(nèi)存量會(huì)隨著設(shè)備驅(qū)動(dòng)程序需求量增加而增加,并會(huì)在驅(qū)動(dòng)程序釋放它時(shí)縮小。因此,Windows Vista 將能夠處理更大范圍的工作負(fù)荷,同樣,即將推出的代號為“Longhorn”的 32 位版本 Windows Server? 也將升級到可以處理更多的并行終端服務(wù)器用戶。 當(dāng)然,在 64 位 Windows Vista 系統(tǒng)上,地址空間約束目前還不屬于實(shí)質(zhì)性的限制,因此,在將這些約束配置為相應(yīng)最大值時(shí),不需要對其進(jìn)行任何特殊處理。 內(nèi)存優(yōu)先級 就像 Windows Vista 添加 I/O 優(yōu)先級(如上一部分中所述)一樣,它還實(shí)現(xiàn)內(nèi)存優(yōu)先級。要了解 Windows 如何使用內(nèi)存優(yōu)先級,就需要掌握內(nèi)存管理器如何實(shí)現(xiàn)其內(nèi)存緩存(稱為“待機(jī)列表”)。在 Windows Vista 之前的所有 Windows 版本中,當(dāng)某個(gè)進(jìn)程所擁有的物理頁面(大小一般為 4KB)被系統(tǒng)回收時(shí),內(nèi)存管理器通常將該頁面置于“待機(jī)列表”末尾。如果進(jìn)程想要再次訪問該頁面,內(nèi)存管理器會(huì)從“待機(jī)列表”獲取該頁面,然后將其重新分配給該進(jìn)程。如果進(jìn)程想要使用物理內(nèi)存的新頁面,但沒有可用的內(nèi)存,則內(nèi)存管理器會(huì)為其提供“待機(jī)列表”前端的頁面。此方案基本上對待機(jī)列表中的所有頁面都同等對待,僅按頁面被置于列表中的時(shí)間來對它們進(jìn)行排序。 在 Windows Vista 上,內(nèi)存的每個(gè)頁面都具有一個(gè)在 0 到 7 之間的優(yōu)先級,這樣,內(nèi)存管理器會(huì)將“待機(jī)列表”劃分為八個(gè)列表,每一個(gè)都用來存儲(chǔ)具有特定優(yōu)先級的頁面。當(dāng)內(nèi)存管理器想要從“待機(jī)列表”中獲取某一頁面時(shí),它會(huì)先從低優(yōu)先級列表獲取頁面。頁面的優(yōu)先級通常反映的是第一個(gè)導(dǎo)致該頁面分配的線程的優(yōu)先級。(如果頁面是共享的,它反映的就是共享線程的最高內(nèi)存優(yōu)先級。)線程會(huì)從其所屬的進(jìn)程繼承它的頁面優(yōu)先級值。當(dāng)內(nèi)存管理器預(yù)見到某一進(jìn)程要訪問內(nèi)存時(shí),會(huì)將低優(yōu)先級用于它從磁盤推測性讀取的頁面。 默認(rèn)情況下,進(jìn)程的頁面優(yōu)先級值為 5,但應(yīng)用程序和系統(tǒng)可通過函數(shù)更改進(jìn)程和線程的頁面優(yōu)先級值。只有從宏觀上理解頁面的相對優(yōu)先級時(shí),才能意識(shí)到內(nèi)存優(yōu)先級的真正價(jià)值,也就是 SuperFetch 所發(fā)揮的作用。 SuperFetch 內(nèi)存管理器的重大改變體現(xiàn)在它對物理內(nèi)存的管理方式。先前版本 Windows 所使用的“待機(jī)列表”管理有兩個(gè)局限性。首先,頁面的優(yōu)先化僅取決于進(jìn)程最近過去的行為,而不會(huì)預(yù)見到它們未來的內(nèi)存需求。其次,用于優(yōu)先化的數(shù)據(jù)僅限定于進(jìn)程在任意給定時(shí)刻所擁有的頁面列表。這兩個(gè)缺點(diǎn)會(huì)導(dǎo)致出現(xiàn)“午餐后綜合癥”之類的狀況,即您離開計(jì)算機(jī)一段時(shí)間,但需要內(nèi)存密集型的系統(tǒng)應(yīng)用程序在此期間一直都在運(yùn)行(例如病毒掃描或磁盤碎片整理)。此應(yīng)用程序會(huì)強(qiáng)制您的活動(dòng)應(yīng)用程序已在內(nèi)存中進(jìn)行緩存處理的代碼和數(shù)據(jù)由內(nèi)存密集型活動(dòng)重寫。等您回來后,就會(huì)發(fā)現(xiàn)性能變得非常緩慢,因?yàn)楦鲬?yīng)用程序必須從磁盤請求它們的數(shù)據(jù)和代碼。 Windows XP 采用了預(yù)取支持,該功能基于以前的引導(dǎo)和應(yīng)用程序啟動(dòng)來執(zhí)行大規(guī)模的磁盤 I/O,以向內(nèi)存預(yù)加載所預(yù)期到的代碼和文件系統(tǒng)數(shù)據(jù),從而改進(jìn)了引導(dǎo)和應(yīng)用程序啟動(dòng)性能。Windows Vista 憑借 SuperFetch 又向前邁進(jìn)了一大步,SuperFetch 是一種通過歷史信息和前瞻性內(nèi)存管理來增強(qiáng)“l(fā)east-recently accessed”(最近最少訪問的)方法的內(nèi)存管理方案。 SuperFetch 作為在服務(wù)主機(jī)進(jìn)程 (%SystemRoot%\System32\Svchost.exe) 內(nèi)運(yùn)行的 Windows 服務(wù)在 %SystemRoot%\System32\Sysmain.dll 中實(shí)現(xiàn)。該方案依賴于內(nèi)存管理器提供的支持,因此它可以檢索頁面使用歷史,以及引導(dǎo)內(nèi)存管理器將來自磁盤文件或分頁文件的數(shù)據(jù)和代碼預(yù)加載到“待機(jī)列表”中,并為各頁面指定優(yōu)先級。SuperFetch 服務(wù)基本上是將頁面跟蹤擴(kuò)展到曾經(jīng)存儲(chǔ)在內(nèi)存中但已被內(nèi)存管理器重新使用以為新數(shù)據(jù)和代碼讓出空間的數(shù)據(jù)和代碼。該服務(wù)會(huì)將這一信息存儲(chǔ)在 %SystemRoot%\Prefetch 目錄中擴(kuò)展名為 .db 的場景文件中(位于用于優(yōu)化應(yīng)用程序啟動(dòng)的標(biāo)準(zhǔn)預(yù)取文件旁邊)。在對內(nèi)存使用情況的這種深入了解基礎(chǔ)上,SuperFetch 可在物理內(nèi)存變?yōu)榭捎脮r(shí)預(yù)加載數(shù)據(jù)和代碼。 只要內(nèi)存變?yōu)榭捎茫ɡ纾?dāng)某應(yīng)用程序退出或釋放內(nèi)存時(shí)),SuperFetch 便會(huì)要求內(nèi)存管理器提取最近被驅(qū)出的數(shù)據(jù)和代碼。這將以每秒少數(shù)幾頁的速率完成,并且 I/O 的優(yōu)先級為“非常低”,以便預(yù)加載操作不會(huì)影響用戶或其他活動(dòng)應(yīng)用程序。因此,如果您離開計(jì)算機(jī)去享用午餐,并且某個(gè)內(nèi)存密集型的后臺(tái)任務(wù)導(dǎo)致活動(dòng)應(yīng)用程序的代碼和數(shù)據(jù)在您離開期間被驅(qū)出內(nèi)存,則 SuperFetch 通常會(huì)在您回來之前將所有或大多數(shù)代碼和數(shù)據(jù)返回到內(nèi)存中。SuperFetch 還包含了對休眠、待機(jī)、快速用戶切換 (FUS) 和應(yīng)用程序啟動(dòng)的特定場景支持。例如,當(dāng)系統(tǒng)處于休眠狀態(tài)時(shí),SuperFetch 會(huì)將數(shù)據(jù)和代碼存儲(chǔ)在它預(yù)期(基于以前的休眠)將在后續(xù)恢復(fù)期間被訪問的休眠文件中。相比之下,當(dāng)您恢復(fù) Windows XP 時(shí),先前緩存的數(shù)據(jù)在被引用時(shí)必須從磁盤重新讀取。 請參閱邊欄“觀察 SuperFetch”以簡單了解 SuperFetch 如何影響可用內(nèi)存。 在您使用 Windows Vista 系統(tǒng)一段時(shí)間后,您會(huì)發(fā)現(xiàn)任務(wù)管理器“性能”頁面上的“可用物理內(nèi)存”計(jì)數(shù)器的數(shù)值很低。這是因?yàn)?SuperFetch 和標(biāo)準(zhǔn) Windows 緩存處理使用了所有可用物理內(nèi)存來緩存磁盤數(shù)據(jù)。例如,在您首次引導(dǎo)時(shí),如果您立即運(yùn)行任務(wù)管理器,則您會(huì)注意到,可用內(nèi)存值會(huì)隨著已緩存內(nèi)存量的增加而減少。如果您運(yùn)行一個(gè)內(nèi)存需求很大的程序,然后退出該程序(分配大量內(nèi)存并在之后釋放內(nèi)存的任何免費(fèi)軟件“RAM 優(yōu)化程序”都適用),或者剛剛復(fù)制了一個(gè)非常大的文件,則在系統(tǒng)回收已釋放內(nèi)存時(shí)可用內(nèi)存量將增加,并且物理內(nèi)存用量圖將下降。但隨著時(shí)間的過去,SuperFetch 會(huì)用被強(qiáng)制離開內(nèi)存的數(shù)據(jù)重新填充緩存,這樣,已緩存內(nèi)存量將增加,可用內(nèi)存量將下降。 ReadyBoost CPU 和內(nèi)存的速度快到超越了硬盤的速度,因此磁盤是一個(gè)常見的系統(tǒng)性能瓶頸。隨機(jī)磁盤 I/O 成本尤為高昂,因?yàn)榇蓬^尋道時(shí)間約為 10 毫秒,這對于現(xiàn)今的 3GHz 處理器來說有些漫長。盡管 RAM 是用于緩存磁盤數(shù)據(jù)的理想選擇,但它的成本也相對較高。不過,閃存通常較為便宜,它隨機(jī)讀取的速度最高可比典型硬盤快 10 倍。因此,Windows Vista 中加入了一個(gè)名為 ReadyBoost 的功能來利用閃存存儲(chǔ)設(shè)備,方法是在這些設(shè)備上創(chuàng)建一個(gè)邏輯上介于內(nèi)存和磁盤之間的中間緩存層。 ReadyBoost 由一個(gè)在 %SystemRoot%\System32\Emdmgmt.dll 中實(shí)現(xiàn)的運(yùn)行于服務(wù)主機(jī)進(jìn)程中的服務(wù)和一個(gè)卷過濾器驅(qū)動(dòng)程序 (%SystemRoot%\System32\Drivers\Ecache.sys) 組成。(Emd 是“外部內(nèi)存設(shè)備”的簡稱,即 ReadyBoost 在開發(fā)期間所使用的工作名稱。)當(dāng)您將 USB 密鑰之類的閃存設(shè)備插入到系統(tǒng)中時(shí),ReadyBoost 服務(wù)會(huì)查看該設(shè)備以確定其性能特征并將測試結(jié)果存儲(chǔ)在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Emdmgmt 中(如圖 1 所示)。 如果您還未使用設(shè)備進(jìn)行緩存處理,并且新設(shè)備大小介于 256MB 和 32GB 之間、對于 4KB 隨機(jī)讀取的傳輸率為 2.5MB/s 或更高、對于 512KB 隨機(jī)寫入的傳輸率為 1.75MB/s 或更高,則 ReadyBoost 將詢問您是否想要將高達(dá) 4GB 的存儲(chǔ)空間專門用于進(jìn)行磁盤緩存。(盡管 ReadyBoost 可以使用 NTFS,它還是會(huì)將最大緩存大小限制在 4GB,以適應(yīng) FAT32 限制。)如果您同意,該服務(wù)便會(huì)在設(shè)備的根目錄下創(chuàng)建一個(gè)名為 ReadyBoost.sfcache 的緩存文件,并要求 SuperFetch 在后臺(tái)預(yù)先填充緩存。 在 ReadyBoost 服務(wù)對緩存進(jìn)行初始化之后,Ecache.sys 設(shè)備驅(qū)動(dòng)程序會(huì)將所有讀寫數(shù)據(jù)截取到本地硬盤卷(例如 C:\),并將要寫入的所有數(shù)據(jù)復(fù)制到該服務(wù)創(chuàng)建的緩存文件中。Ecache.sys 會(huì)將數(shù)據(jù)壓縮,壓縮比通常達(dá)到 2:1,這樣,4GB 的緩存文件通常將包含 8GB 數(shù)據(jù)。驅(qū)動(dòng)程序會(huì)聯(lián)合使用高級加密標(biāo)準(zhǔn) (AES) 和一個(gè)隨機(jī)生成的每引導(dǎo)會(huì)話密鑰對其寫入的每個(gè)塊進(jìn)行加密,以在將設(shè)備從系統(tǒng)移除的情況下保證緩存中數(shù)據(jù)的保密性。 當(dāng) ReadyBoost 確定可從緩存滿足隨機(jī)讀取需求時(shí),它便會(huì)從那里向隨機(jī)讀取提供服務(wù),但由于硬盤的有序讀取訪問要?jiǎng)龠^閃存,因此,它允許有序訪問模式中的讀數(shù)據(jù)直接移至磁盤,即使該數(shù)據(jù)位于緩存中。 ReadyBoot 如果系統(tǒng)的內(nèi)存不到 512MB,則 Windows Vista 會(huì)使用與 Windows XP 一樣的引導(dǎo)時(shí)預(yù)取,但如果系統(tǒng)的 RAM 為 700MB 或以上,它便會(huì)使用 RAM 內(nèi)緩存來優(yōu)化引導(dǎo)進(jìn)程。緩存的大小取決于可用 RAM 總量,但這足以創(chuàng)建適當(dāng)?shù)木彺?,并還可以為系統(tǒng)留出要順利引導(dǎo)所需的內(nèi)存。 在每一次引導(dǎo)后,ReadyBoost 服務(wù)(就是剛剛介紹的用于實(shí)現(xiàn) ReadyBoost 功能的服務(wù))會(huì)使用空閑 CPU 時(shí)間來為下一次引導(dǎo)計(jì)算引導(dǎo)時(shí)緩存計(jì)劃。它會(huì)分析來自前五次引導(dǎo)的文件跟蹤信息,并標(biāo)識(shí)出訪問了哪些文件以及這些文件在磁盤上的位置。該服務(wù)將已處理的跟蹤信息以 .fx 文件形式存儲(chǔ)在 %SystemRoot%\Prefetch\Readyboot 中,并將緩存計(jì)劃保存在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters 下的 REG_BINARY 值(這些值針對它們所引用的內(nèi)部磁盤卷而命名)中。 緩存由實(shí)現(xiàn) ReadyBoost 緩存處理的同一設(shè)備驅(qū)動(dòng)程序 (Ecache.sys) 實(shí)現(xiàn),但緩存的填充則是由 ReadyBoost 服務(wù)在系統(tǒng)引導(dǎo)時(shí)帶領(lǐng)完成。盡管引導(dǎo)緩存像 ReadyBoost 緩存一樣進(jìn)行壓縮,但 ReadyBoost 和 ReadyBoot 緩存管理之間的另一個(gè)區(qū)別是,在 ReadyBoot 模式下,除了 ReadyBoost 服務(wù)的更新之外,緩存不會(huì)變?yōu)榉从吃谝龑?dǎo)期間讀取或?qū)懭氲臄?shù)據(jù)。ReadyBoost 服務(wù)會(huì)在引導(dǎo)開始后 90 秒時(shí)(或者在其他內(nèi)存需求批準(zhǔn)它的情況下)將緩存刪除,并將緩存的統(tǒng)計(jì)信息記錄在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats 中(如圖 2 所示)。Microsoft 性能測試表明,與舊有 Windows XP 預(yù)取器相比,ReadyBoot 使性能提高了約 20%。 ReadyDrive ReadyDrive 是一項(xiàng)利用了名為 H-HDD 的新型混合硬盤驅(qū)動(dòng)器的 Windows Vista 功能。H-HDD 是一種帶有嵌入式非易失性閃存(還稱為 NVRAM)的磁盤。典型 H-HDD 所包含的緩存大小介于 50MB 和 512MB 之間,但 Windows Vista 緩存限制為 2TB。 Windows Vista 使用 ATA-8 命令來定義要在閃存中存放的磁盤數(shù)據(jù)。例如,Windows Vista 會(huì)在系統(tǒng)關(guān)閉時(shí)將引導(dǎo)數(shù)據(jù)保存到緩存,從而可以更快速地重新啟動(dòng)。它還會(huì)在系統(tǒng)處于休眠狀態(tài)時(shí)將某些部分的休眠文件數(shù)據(jù)存儲(chǔ)在緩存中,以便加速后來的恢復(fù)過程。即使在磁盤盤片降速時(shí)也會(huì)啟用緩存,因此,Windows 可以將閃存用作磁盤寫入緩存,這樣可避免在系統(tǒng)靠電池電源運(yùn)行時(shí)將磁盤盤片加速。使磁盤軸保持關(guān)閉狀態(tài)可以節(jié)省由磁盤驅(qū)動(dòng)器在正常使用期間所消耗的大量電源。 引導(dǎo)配置數(shù)據(jù)庫 Windows Vista 在啟動(dòng)和關(guān)閉方面增強(qiáng)了許多功能。隨著“引導(dǎo)配置數(shù)據(jù)庫”(BCD) 的采用,啟動(dòng)功能在存儲(chǔ)系統(tǒng)和 OS 啟動(dòng)配置、系統(tǒng)啟動(dòng)進(jìn)程的新流程和組織、新登錄體系結(jié)構(gòu)以及對延遲式自動(dòng)啟動(dòng)服務(wù)的支持方面都有所改進(jìn)。Windows Vista 關(guān)閉方面的變化包括 Windows 服務(wù)的預(yù)關(guān)閉通知、Windows 服務(wù)關(guān)閉排序以及 OS 對電源狀態(tài)轉(zhuǎn)換的管理方式的重大改變。 啟動(dòng)進(jìn)程的最明顯變化之一是,系統(tǒng)卷的根目錄中沒有了 Boot.ini。這是因?yàn)椋龑?dǎo)配置現(xiàn)在存儲(chǔ)在 BCD 中(在先前版本的 Windows 上,它存儲(chǔ)在 Boot.ini 文本文件中)。Windows Vista 使用 BCD 的其中一個(gè)原因是,BCD 將 Windows 支持的兩個(gè)當(dāng)前引導(dǎo)體系結(jié)構(gòu)合為了一體:主引導(dǎo)記錄 (MBR) 和可擴(kuò)展固件接口 (EFI)。MBR 通常由 x86 和 x64 桌面系統(tǒng)使用,而 EFI 則由基于 Itanium 的系統(tǒng)使用(但在不久的將來,桌面 PC 很有可能會(huì)附帶 EFI 支持)。BCD 對固件進(jìn)行了抽象化,并具有超越 Boot.ini 的其他優(yōu)點(diǎn),例如,對 Unicode 字符串和備用預(yù)引導(dǎo)可執(zhí)行文件的支持。 BCD 實(shí)際上存儲(chǔ)在磁盤上的某個(gè)加載到 Windows 注冊表中以通過注冊表 API 進(jìn)行訪問的注冊表配置單元中。在 PC 上,Windows 將其存儲(chǔ)在系統(tǒng)卷上的 \Boot\Bcd 中。在 EFI 系統(tǒng)上,它位于 EFI 系統(tǒng)分區(qū)上。在加載了該配置單元后,它會(huì)在 HKLM\Bcd00000000 下顯示,但因其內(nèi)部格式?jīng)]有文檔記錄,所以編輯它時(shí)需要使用 %SystemRoot%\System32\Bcdedit.exe 之類的工具。也可通過 Windows Management Instrumentation (WMI) 將用來操縱 BCD 的接口提供給腳本和自定義編輯器使用,并且可以使用“Windows 系統(tǒng)配置實(shí)用程序”(%SystemRoot%\System32\Msconfig.exe) 來編輯或添加基本參數(shù)(如內(nèi)核調(diào)試選項(xiàng))。 BCD 將平臺(tái)范圍的引導(dǎo)設(shè)置(例如,默認(rèn) OS 選擇和引導(dǎo)菜單超時(shí)時(shí)間)與 OS 特定的設(shè)置(例如,OS 引導(dǎo)選項(xiàng)和 OS 引導(dǎo)加載器的路徑)分割開來。例如,圖 3 顯示了在您未使用命令行選項(xiàng)運(yùn)行 Bcdedit 時(shí),BCD 會(huì)在輸出上部的“Windows 引導(dǎo)管理器”部分顯示平臺(tái)設(shè)置,接著在“Windows 引導(dǎo)加載器”部分顯示 OS 特定的設(shè)置。 當(dāng)您引導(dǎo) Windows Vista 安裝時(shí),這個(gè)新方案會(huì)將在先前版本 Windows 上由操作系統(tǒng)加載器 (Ntldr) 處理的任務(wù)劃分為兩種不同的可執(zhí)行文件:\BootMgr 和 %SystemRoot%\System32\Winload.exe。Bootmgr 會(huì)讀取 BCD 并顯示 OS 引導(dǎo)菜單,而 Winload.exe 會(huì)處理操作系統(tǒng)加載。如果您要執(zhí)行干凈引導(dǎo),則 Winload.exe 會(huì)加載引導(dǎo)啟動(dòng)設(shè)備驅(qū)動(dòng)程序和核心操作系統(tǒng)文件(包括 Ntoskrnl.exe),并將控制權(quán)移交給操作系統(tǒng);如果系統(tǒng)要從休眠狀態(tài)恢復(fù),則 Winload.exe 會(huì)通過執(zhí)行 %SystemRoot%\System32\Winresume.exe 將休眠數(shù)據(jù)加載到內(nèi)存中并恢復(fù) OS。 Bootmgr 還包含對其他預(yù)引導(dǎo)可執(zhí)行文件的支持。Windows Vista 還隨帶了 Windows 內(nèi)存診斷 (\Boot\Memtest.exe),該工具已被預(yù)配置為用于檢查 RAM 性能狀況的選項(xiàng),但第三方可以添加其自己的預(yù)引導(dǎo)可執(zhí)行文件,以作為將在 Bootmgr 的引導(dǎo)菜單中顯示的選項(xiàng)使用。 啟動(dòng)進(jìn)程 在先前版本的 Windows 中,各種系統(tǒng)進(jìn)程之間的關(guān)系并不直觀。例如,在系統(tǒng)引導(dǎo)時(shí),交互登錄管理器 (%SystemRoot%\System32\Winlogon.exe) 會(huì)啟動(dòng)“本地安全機(jī)構(gòu)子系統(tǒng)服務(wù)”(Lsass.exe) 和“服務(wù)控制管理器”(Services.exe)。此外,Windows 會(huì)使用一個(gè)名為 Session 的命名空間容器來隔離在不同登錄會(huì)話中運(yùn)行的進(jìn)程。但在推出 Windows Vista 之前,登錄到控制臺(tái)的用戶共享的是 Session 0(即,由系統(tǒng)進(jìn)程使用的會(huì)話),這就造成了潛在的安全問題。例如,如果某個(gè)運(yùn)行于 Session 0 中的編寫拙劣的 Windows 服務(wù)在交互式控制臺(tái)上顯示一個(gè)用戶界面,從而允許惡意軟件通過粉碎攻擊之類的方法來攻擊窗口并有可能獲得管理特權(quán),就會(huì)引發(fā)此類安全問題。 為解決這些問題,若干個(gè)系統(tǒng)進(jìn)程都針對 Windows Vista 進(jìn)行了重新設(shè)計(jì)。會(huì)話管理器 (Smss.exe) 是在使用先前版本的 Windows 時(shí)在引導(dǎo)期間創(chuàng)建的第一個(gè)用戶模式進(jìn)程,但在 Windows Vista 上,會(huì)話管理器會(huì)啟動(dòng)自己的另一個(gè)實(shí)例來配置 Session 0,該會(huì)話將獨(dú)自供系統(tǒng)進(jìn)程專用。用于 Session 0 的會(huì)話管理器進(jìn)程將啟動(dòng)“Windows 啟動(dòng)應(yīng)用程序”(Wininit.exe)(一個(gè)用于 Session 0 的 Windows 子系統(tǒng)進(jìn)程 (Csrss.exe)),然后退出?!癢indows 啟動(dòng)應(yīng)用程序”會(huì)通過啟動(dòng)“服務(wù)控制管理器”、“本地安全機(jī)構(gòu)子系統(tǒng)”和一個(gè)用來管理計(jì)算機(jī)的終端服務(wù)器連接的新進(jìn)程(即“本地會(huì)話管理器”(Lsm.exe))持續(xù)運(yùn)行。 當(dāng)用戶登錄到系統(tǒng)上時(shí),初始的會(huì)話管理器會(huì)創(chuàng)建其自己的一個(gè)新實(shí)例來配置新會(huì)話。新的 Smss.exe 進(jìn)程會(huì)為這個(gè)新會(huì)話啟動(dòng) Windows 子系統(tǒng)進(jìn)程和 Winlogon 進(jìn)程。讓主會(huì)話管理器使用自己的副本初始化新會(huì)話并不會(huì)為客戶端系統(tǒng)帶來任何有利條件,但在充當(dāng)終端服務(wù)器的 Windows Server“Longhorn”系統(tǒng)上,可以并行運(yùn)行多個(gè)副本以提高多個(gè)用戶的登錄速度。 在這個(gè)新的體系結(jié)構(gòu)下,各系統(tǒng)進(jìn)程(包括 Windows 服務(wù))在 Session 0 中進(jìn)行了隔離。如果運(yùn)行于 Session 0 中的某個(gè) Windows 服務(wù)顯示一個(gè)用戶界面,則“交互服務(wù)檢測”服務(wù) (%SystemRoot%\System32\UI0Detect.exe) 會(huì)通過在用戶的安全上下文中啟動(dòng)自己的實(shí)例并顯示圖 4 中所示的消息來通知所有登錄的管理員。如果用戶選擇“顯示消息”按鈕,該服務(wù)會(huì)將桌面切換到 Windows 服務(wù)桌面,用戶可在這里與服務(wù)的用戶界面交互,然后再切換回自己的桌面。有關(guān)啟動(dòng)時(shí)會(huì)出現(xiàn)哪些情況的詳細(xì)信息,請參閱邊欄“查看啟動(dòng)進(jìn)程關(guān)系”。 可使用 Sysinternals (microsoft.com/technet/sysinternals) 提供的 Process Explorer 來查看 Windows Vista 的進(jìn)程啟動(dòng)樹。 屏幕快照包括“會(huì)話”列,您可通過 Process Explorer 的列對話框添加它。突出顯示的進(jìn)程是初始的 Smss.exe。位于它下面的是 Session 0 的 Csrss.exe 和 Wininit.exe,由于這兩個(gè)進(jìn)程的父進(jìn)程(用于配置 Session 0 的 Smss.exe 實(shí)例)已經(jīng)退出,因此它們左對齊。Wininit 的三個(gè)子進(jìn)程分別是 Services.exe、Lsass.exe 和 Lsm.exe。 Process Explorer 將一組進(jìn)程標(biāo)識(shí)為在 Session 1 中運(yùn)行,也就是我通過遠(yuǎn)程桌面連接登錄到的會(huì)話。Process Explorer 用藍(lán)色突出色來顯示與自身使用相同帳戶運(yùn)行的進(jìn)程。最后,將 Session 2 初始化,以為登錄到控制臺(tái)并創(chuàng)建新登錄會(huì)話的用戶做好準(zhǔn)備。就是在該會(huì)話中,Winlogon 將運(yùn)行并使用 LogonUI 要求新的控制臺(tái)用戶“按 Ctrl+Alt+DELETE 進(jìn)行登錄”,而且在該會(huì)話中,Logonui.exe 將要求用戶提供其憑據(jù)。 憑據(jù)提供程序 即使是登錄體系結(jié)構(gòu)也在 Windows Vista 上發(fā)生了變化。在先前版本的 Windows 上,Winlogon 進(jìn)程會(huì)加載在注冊表中指定的“圖形識(shí)別與認(rèn)證”(GINA) DLL 來顯示要求用戶提供其憑據(jù)的登錄 UI。遺憾的是,GINA 模式受到了許多限制,包括只能配置一個(gè) GINA、第三方很難編寫完整的 GINA,以及具有非標(biāo)準(zhǔn)用戶界面的自定義 GINA 會(huì)改變 Windows 用戶體驗(yàn)。 而 Windows Vista 使用了新的“憑據(jù)提供程序”體系結(jié)構(gòu)來代替 GINA。Winlogon 會(huì)啟動(dòng)一個(gè)單獨(dú)的進(jìn)程,即“登錄用戶界面主機(jī)”(Logonui.exe),該進(jìn)程將加載在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Authentication\Credential Providers 中配置的憑據(jù)提供程序。Logonui 可以并行托管多個(gè)憑據(jù)提供程序;實(shí)際上,Windows Vista 隨帶了交互式 (Authui.dll) 提供程序和智能卡式 (Smart-cardcredentialprovider.dll) 提供程序。為確保統(tǒng)一的用戶體驗(yàn),LogonUI 會(huì)管理對最終用戶顯示的用戶界面,但它還會(huì)允許憑據(jù)提供程序指定文本、圖標(biāo)和編輯控件之類的自定義元素。 延遲式自動(dòng)啟動(dòng)服務(wù) 如果您曾經(jīng)在 Windows 系統(tǒng)啟動(dòng)后立即登錄到系統(tǒng)上,您或許在桌面被完全配置并且您可以與外殼和所啟動(dòng)的任何應(yīng)用程序進(jìn)行交互之前經(jīng)歷了一些延遲。在您登錄時(shí),“服務(wù)控制管理器”會(huì)啟動(dòng)多個(gè)被配置為自動(dòng)啟動(dòng)服務(wù)并因此在引導(dǎo)時(shí)激活的 Windows 服務(wù)。許多服務(wù)都會(huì)執(zhí)行與登錄活動(dòng)爭用資源的 CPU 密集型初始化和磁盤密集型初始化。為解決此問題,Windows Vista 采用了一個(gè)被稱為延遲式自動(dòng)啟動(dòng)的新服務(wù)啟動(dòng)類型,如果服務(wù)不必在 Windows 引導(dǎo)后立即激活,便可使用該類型。 “服務(wù)控制管理器”會(huì)在自動(dòng)啟動(dòng)服務(wù)完成啟動(dòng)后再啟動(dòng)配置為延遲式自動(dòng)啟動(dòng)的服務(wù),并將這些服務(wù)的初始線程優(yōu)先級設(shè)置為 THREAD_PRIORITY_LOWEST。此優(yōu)先級別會(huì)使線程執(zhí)行的所有磁盤 I/O 都采用“非常低”I/O 優(yōu)先級。在服務(wù)完成初始化后,“服務(wù)控制管理器”會(huì)將其優(yōu)先級設(shè)置為普通。將延遲式啟動(dòng)、較低的 CPU 和內(nèi)存優(yōu)先級與后臺(tái)磁盤優(yōu)先級結(jié)合后,大大減少了與用戶登錄間的相互沖突。許多 Windows 服務(wù)(包括后臺(tái)智能傳輸、Windows Update 客戶端和 Windows Media? Center)都使用這個(gè)新啟動(dòng)類型來幫助提升引導(dǎo)后的登錄性能。 關(guān)閉 困擾著 Windows 服務(wù)編寫人員的一個(gè)問題是,在 Windows 關(guān)閉過程中,默認(rèn)情況下他們最多只有二十秒鐘的時(shí)間來執(zhí)行清理。Windows Vista 之前的 Windows 版本一直不支持等待所有服務(wù)都退出的干凈關(guān)閉,因?yàn)榇嬖诔绦蝈e(cuò)誤的服務(wù)可能會(huì)無限期地阻止關(guān)閉。有些服務(wù)(例如那些具有與網(wǎng)絡(luò)相關(guān)的關(guān)閉操作或必須將大量數(shù)據(jù)保存到磁盤的服務(wù))可能需要更多的時(shí)間,因此 Windows Vista 允許服務(wù)請求預(yù)關(guān)閉通知。 在 Windows Vista 關(guān)閉時(shí),“服務(wù)控制管理器”會(huì)首先通知那些要求預(yù)關(guān)閉通知的服務(wù)。它將無限期地等待這些服務(wù)退出,但如果這些服務(wù)存在程序錯(cuò)誤且沒有響應(yīng)查詢,則“服務(wù)控制管理器”會(huì)在三分鐘后放棄并繼續(xù)前進(jìn)。一旦所有這些服務(wù)都已退出或超時(shí)時(shí)間已滿,“服務(wù)控制管理器”就會(huì)接著對剩余的服務(wù)執(zhí)行舊有形式的服務(wù)關(guān)閉。組策略和 Windows Update 服務(wù)會(huì)在全新的 Windows Vista 安裝中注冊預(yù)關(guān)閉通知。 組策略和 Windows Update 服務(wù)還會(huì)使用另一個(gè) Windows Vista 服務(wù)功能:關(guān)閉排序。各服務(wù)始終都可以指定啟動(dòng)依存性,“服務(wù)控制管理器”要服從這些依存性以按照滿足這些依存性的順序來啟動(dòng)服務(wù),但在 Windows Vista 之前,各服務(wù)還無法指定關(guān)閉依存性。現(xiàn)在,注冊預(yù)關(guān)閉通知的服務(wù)也可以將其自己插入到存儲(chǔ)在 HKLM\System\CurrentControlSet\Control\PreshutdownOrder 的列表中,“服務(wù)控制管理器”將根據(jù)它們的相應(yīng)順序?qū)⑵潢P(guān)閉。有關(guān)這些服務(wù)的詳細(xì)信息,請參閱邊欄“標(biāo)識(shí)延遲式自動(dòng)啟動(dòng)和預(yù)關(guān)閉服務(wù)”。 電源管理 睡眠和休眠屬于其他形式的關(guān)閉,自 Windows 2000 將電源管理引入到 Windows NT? 系列的 Windows 操作系統(tǒng)后,驅(qū)動(dòng)程序和應(yīng)用程序方面的問題重重的電源管理一直都是令商務(wù)旅行人士苦惱的一件事情。當(dāng)許多用戶在踏上旅途前合上自己的便攜式計(jì)算機(jī)外蓋時(shí),都期望計(jì)算機(jī)系統(tǒng)處于掛起或休眠狀態(tài),但沒想到在到達(dá)目的地時(shí),手提箱已經(jīng)變得灼熱,電池也被用盡,而且還丟失了數(shù)據(jù)。這是因?yàn)?Windows 始終都會(huì)詢問設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序是否允許更改電源狀態(tài),只要有一個(gè)驅(qū)動(dòng)程序或應(yīng)用程序未響應(yīng),就可能會(huì)阻止轉(zhuǎn)換。 在 Windows Vista 中,內(nèi)核的電源管理器仍會(huì)通知驅(qū)動(dòng)程序和應(yīng)用程序要更改電源狀態(tài)以便它們可以為這些更改做好準(zhǔn)備,但不會(huì)再請求許可。此外,電源管理器最多會(huì)留出 20 秒來等待應(yīng)用程序?qū)Ω耐ㄖ龀鲰憫?yīng),而不是像在先前版本的 Windows 上那樣等待 2 分鐘。因此,Windows Vista 用戶可以更加確信自己的系統(tǒng)會(huì)執(zhí)行休眠和掛起。 預(yù)告 正如我先前所說的,這是由三部分組成的系列文章中的第二部分。第一部分介紹了 Windows Vista 內(nèi)核在 I/O 和進(jìn)程方面的改進(jìn)。這一次,我分析了 Windows Vista 在內(nèi)存管理、啟動(dòng)和關(guān)閉方面的增強(qiáng)。下一次,我將通過介紹內(nèi)核在可靠性和安全性方面的改變來結(jié)束本系列文章。 內(nèi)置的 SC 命令在 Windows Vista 得到了更新,以顯示配置為延遲式自動(dòng)啟動(dòng)服務(wù)的服務(wù): 遺憾的是,SC 命令不會(huì)報(bào)告已請求預(yù)關(guān)閉通知的服務(wù),但您可以使用 Sysinternals 提供的 PsService 實(shí)用程序來確保服務(wù)接受預(yù)關(guān)閉通知: 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ì)議上演講。在 Microsoft 最近收購了 Mark Russinovich 與其他人創(chuàng)辦的 Winternals Software 之后,Mark Russinovich 也隨之加入了 Microsoft。他還創(chuàng)辦了 Sysinternals,在那里他發(fā)布了 Process Explorer、Filemon 和 Regmon 實(shí)用程序。 |
|