2007年7月19日 星期四

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

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

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

At a Glance:
* 記憶體管理
* 啟動和關機
* 電源管理


上個月,在此三篇一系列文章的第一篇內,我探討了處理程序和 I/O 方面的 Windows Vista 核心增強功能。

這次我要討論 Windows Vista 記憶體管理方式的加強,以及系統啟動、關機和電源管理的主要改進 (第一篇)。

每一版的 Windows® 都會改進延展性和效能,Windows Vista™ 也不例外。Windows Vista 記憶體管理員包括許多的增強功能,例如更廣泛地使用鎖定-釋放同步處理技巧、更細微的鎖定、更緊密的資料結構封裝、更大的分頁 I/O、支援最新 GPU 記憶體架構,以及更有效地使用硬體轉譯對應緩衝區。此外,Windows Vista 記憶體管理現在可針對不同工作量的需求,提供動態位址空間配置。

Windows Vista 作業系統中首次引進使用新技術的四種效能增強功能:SuperFetch、ReadyBoost、ReadyBoot 及 ReadyDrive。我會在本文後面詳細討論這些功能。


動態核心位址空間

Windows 和在 Windows 上執行的應用程式一直為 32 位元處理器的位址空間限制所苦。Windows 核心預設的限制是 2GB,或者 32 位元虛擬位址總空間的一半,另一半則保留給目前在 CPU 上執行執行緒的處理程序使用。在核心所能使用的一半空間中,核心必須對應自己本身、裝置驅動程式、檔案系統快取、核心堆疊、每一工作階段程式碼資料結構, 以及裝置驅動程式所配置的非分頁 (鎖定實體記憶體) 和分頁緩衝區。在 Windows Vista 之前,記憶體管理員在開機時會決定指派多少位址空間給這些不同的用途,但是這種缺乏彈性的方法有時會造成某個區域已用盡,而其他區域仍有大量的可用空間。 某個區域耗盡會造成應用程式失敗,並使得裝置驅動程式無法完成 I/O 操作。

在 32 位元 Windows Vista 中,記憶體管理員會動態地管理核心的位址空間,隨著工作量需求的需要配置及解除配置空間給各種用途。因此,當裝置驅動程式要求增加時,可以增加用於儲存分 頁緩衝區的虛擬記憶體數量,而當驅動程式釋放記憶體時,則可以減少其數量。所以 Windows Vista 將可以處理更多的工作量,同樣地,即將推出的 Windows Server® (代號 "Longhorn") 也能夠擴充,以處理更多的同時執行終端機伺服器使用者。

當然,在 64 位元 Windows Vista 系統上,位址空間限制目前並未造成真正的限制,因為都已設定到其最大值,所以不需要特別處理。


記憶體優先順序

Windows Vista 不只增加了 I/O 優先順序 (我在第一篇已介紹過),也實作了記憶體優先順序。要了解 Windows 如何使用記憶體優先順序,必須先了解記憶體管理員如何實作其記憶體快取 (稱為待命清單)。在 Windows Vista 之前的所有 Windows 版本中,當系統收回處理程序所擁有的實體分頁 (大小通常是 4KB) 時,記憶體管理員通常會將分頁放在待命清單的最後面。如果處理程序想要再次存取分頁,記憶體管理員就會從待命清單中取出分頁,然後重新指派給處理程序。如 果處理程序想要使用新的實體記憶體分頁,但是沒有可用記憶體可使用時,記憶體管理員就會將待命清單前面的分頁指派給處理程序。這種配置實質上會將待命中的 所有分頁同等處理,只使用分頁放入清單中的時間將分頁排序。

在 Windows Vista 中,每個記憶體分頁都有 0 到 7 範圍內的優先順序,而記憶體管理員也將待命清單分成八份清單,每份清單都儲存一個特定優先順序的分頁。當記憶體管理員想要從待命清單取出分頁時,會先從低 優先順序清單取出分頁。分頁的優先順序通常反映最先引起分頁配置之執行緒的優先順序 (如果分頁是共用的,則反映共用執行緒中最高的記憶體優先順序)。執行緒會從它所屬的處理程序繼承分頁優先順序值。記憶體管理員在預期處理程序的記憶體存 取需求時,會針對它從磁碟推測讀取之分頁,使用低優先順序。

根據預設,處理程序的分頁優先順序值為 5,但是應用程式和系統可以利用函數來變更處理程序與執行緒的分頁優先順序值。唯有全面了解分頁的相對優先順序 (這就是 SuperFetch 的角色),才能發揮記憶體優先順序的真正威力。


SuperFetch

記 憶體管理員的一項重大變更,就是其管理實體記憶體的方式。舊版 Windows 所使用的待命清單管理有兩個限制。第一,分頁的優先順序只依賴處理程序最近已發生的行為,並不會預期它們未來的記憶體需求。第二,優先順序使用的資料只限 於處理程序在任一特定時間點所擁有的分頁清單。這些缺點可能會造成「啟動後症候群」之類的狀況,就是您離開電腦一段時間,同時電腦上有需要大量記憶體的系 統應用程式在執行 (例如防毒軟體掃描或磁碟重組)。此應用程式會導致需要大量記憶體的活動,強制覆寫使用中應用程式原來存放在記憶體快取中的程式碼和資料。等到您回來時, 會發現效能已變差,因為應用程式必須向磁碟要求其資料和程式碼。

Windows XP 引進了預先擷取支援,根據以前的開機和應用程式啟動,執行大量磁碟 I/O 以預先載入包含它所預期之程式碼和檔案系統資料的記憶體,改進了開機和應用程式啟動效能。Windows Vista 的 SuperFetch 則有更大的改進。SuperFetch 是一種記憶體管理配置,利用歷史資訊和主動的記憶體管理,加強近來最少存取的方法。

SuperFetch 會在 %SystemRoot%\System32\Sysmain.dll 中實作,在服務主機處理程序 (%SystemRoot%\System32\Svchost.exe) 中以 Windows 服務執行。此配置依賴記憶體管理員的支援,以便擷取分頁使用歷程,並指示記憶體管理員從磁碟上的檔案,或從分頁檔案預先將資料和程式碼載入待命清單,並為 分頁指派優先順序。SuperFetch 服務實際上是將分頁追蹤延伸至資料和程式碼,這些資料和程式碼曾經放在記憶體中,但是記憶體管理員已重新使用記憶體以提供空間給新的資料和程式碼。它會將 此資訊儲存在 %SystemRoot%\Prefetch 目錄下副檔名為 .db 的狀況檔案中,同時儲存的還有用於將應用程式啟動最佳化的標準預先擷取檔案。SuperFetch 會利用對記憶體使用模式的了解,在實體記憶體可用時預先載入資料和程式碼。

只要記憶體變成可用 (例如,當應用程式結束或釋放記憶體時),SuperFetch 就會要求記憶體管理員擷取最近收回的資料和程式碼。這是以「非常低」優先順序 I/O 的速度執行,每秒只有幾個分頁,以免預先載入影響使用者或其他使用中應用程式。因此,您若是離開電腦去吃午餐,而需要大量記憶體的背景工作在您離開時造成 您使用中應用程式的程式碼和資料被收回,SuperFetch 通常可在您回來之前將全部或大部分的程式碼和資料放回記憶體中。SuperFetch 也包含休眠、待命、快速切換使用者 (FUS) 及應用程式啟動等特定的狀況支援。例如,當系統休眠時,SuperFetch 會將它 (根據以往的休眠) 預期恢復執行時要存取的資料和程式碼,儲存在休眠檔案中。相對地,當您恢復執行 Windows XP 時,若參照到先前快取的資料,則需從磁碟重新讀取。

有關 SuperFetch 如何影響可用記憶體的簡介,請參閱以下「注意 SuperFetch」說明。


注意 SuperFetch

您使用 Windows Vista 系統一段時間後,就會看到工作管理員之 [效能] 頁面上的可用實體記憶體計數器顯示低數量。這是因為 SuperFetch 和標準 Windows 快取會使用所有可用的實體記憶體來快取磁碟資料。例如,當您首次開機時,如果立即執行工作管理員,應該會注意到隨著快取記憶體數量增加,可用記憶體值就會 跟著減少。或者,您若是執行記憶體需求極大的程式,然後結束程式 (任何會配置大量記憶體,然後再釋放記憶體的「RAM 最佳化程式」免費軟體都行),或者剛剛複製很大的檔案,隨著系統收回已配置的記憶體,[可用] 的數量會增加,而 [實體記憶體使用量] 圖形會下降。但是,SuperFetch 會隨著時間將先前強制從記憶體移出的資料重新填入快取中,因此 [快取] 數量會增加,而 [可用] 數量會減少。

Watching memory (Click the image for a larger view)


ReadyBoost

CPU 和記憶體的速度遠快於硬碟的速度,因此磁碟是常見的系統效能瓶頸。隨機磁碟 I/O 更是惡夢,因為磁碟頭搜尋時間大約是 10 毫秒,對現在 3GHz 的處理器而言是很漫長的時間。雖然 RAM 很適合快取磁碟資料,但是相對而言它很昂貴。不過,Flash 記憶體通常比較便宜,而且隨機讀取的速度最高可比一般硬碟快 10 倍。因此,Windows Vista 包含名為 ReadyBoost 的功能,這會在 Flash 記憶體存放裝置上,建立邏輯位置在記憶體和磁碟之間的中繼快取層,以利用 Flash 記憶體存放裝置的優勢。

ReadyBoost 包含一個在 %SystemRoot%\System32\Emdmgmt.dll 中實作的服務 (這會在服務主機處理程序中執行),以及一個磁碟區篩選器驅動程式 %SystemRoot%\System32\Drivers\Ecache.sys. (Emd 是外部記憶體裝置 (External Memory Device) 的縮寫,此名稱是 ReadyBoost 在開發過程中使用的名稱)。您將 USB 金鑰之類的 Flash 裝置插入至系統時,ReadyBoost 服務會檢查裝置以判斷其效能特性,並將其測試結果儲存在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Emdmgmt 中,請參閱 [圖 1]。

Figure 1 ReadyBoost device test results in the registry

如果您尚未使用快取的裝置,而且新裝置的大小介於 256MB 和 32GB 之間、隨機 4KB 讀取的傳送速率可達 2.5MB/s 或更快、隨機 512KB 寫入的傳送速率達到 1.75MB/s 或更快,ReadyBoost 就會詢問您是否要固定使用最多 4GB 的儲存體做為磁碟快取 (雖然 ReadyBoost 可以使用 NTFS,不過它將最大快取大小限制在 4GB,以配合 FAT32 限制)。您如果同意,服務就會在裝置的根目錄建立名為 ReadyBoost.sfcache 的快取檔案,並要求 SuperFetch 在背景填入快取。

在 ReadyBoost 服務初始化快取之後,Ecache.sys 裝置驅動程式會攔截對本機硬碟磁碟區 (例如 C:\) 的所有讀取和寫入,並將寫入的任何資料複製到服務所建立的快取檔案中。Ecache.sys 會壓縮資料,而且壓縮比率通常可達到 2:1,因此 4GB 的快取檔案通常會包含 8GB 的資料。驅動程式使用先進加密標準 (AES) 加密,配合隨機產生的每一開機工作階段金鑰將其寫入的每一個區塊加密,以保證裝置若是從系統移除時的資料隱私權。

ReadyBoost 看到可利用快取滿足的隨機讀取時,會從快取提供服務,但是因為硬碟的循序讀取存取優於 Flash 記憶體,所以即使快取中有資料,它也會讓屬於循序存取模式的讀取直接送往磁碟。


ReadyBoot

如 果系統的記憶體小於 512MB,Windows Vista 就使用與 Windows XP 相同的開機預先擷取,但是如果系統有 700MB 或更多的 RAM,它則會使用 RAM 快取將開機程序最佳化。快取的大小會視可用的 RAM 總數量而定,不過已大到足夠建立合理的快取,同時還可讓系統擁有順暢開機所需的記憶體。

在每次開機之後, ReadyBoost 服務 (與實作 ReadyBoost 功能相同的服務,剛剛已介紹過) 會使用閒置 CPU 時間,來計算下次開機的開機快取計劃。它會分析前五次開機的檔案追蹤資訊,並確認先前存取過哪些檔案,以及這些檔案在磁碟上的位置。它會將處理過的追蹤儲 存到 %SystemRoot%\Prefetch\Readyboot 底下的 .fx 檔案中,並將快取計劃儲存在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters 底下,針對追蹤參考的內部磁碟區命名的 REG_BINARY 值中。

快取是由實作 ReadyBoost 快取的同一個裝置驅動程式 (Ecache.sys) 實作,但是快取的填入則是由 ReadyBoost 服務在系統開機時主導。雖然開機快取也像 ReadyBoost 快取一樣會壓縮,不過 ReadyBoost 和 ReadyBoot 快取之間的另一項差異是,當處於 ReadyBoot 模式時,除了 ReadyBoost 服務的更新之外,快取並不會變更以反映開機過程中讀取或寫入的資料。ReadyBoost 服務會在開機開始之後 90 秒刪除快取 (如果有其他記憶體需求則更快),並將快取的統計資料記錄在 HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats 中,如 [圖 2] 所示。Microsoft 效能測試顯示,ReadyBoot 的效能比舊版 Windows XP 預先擷取程式改進了 20%。

Figure 2 ReadyBoot Performance statistics (Click the image for a larger view)


ReadyDrive

ReadyDrive 是 Windows Vista 中利用新的交互式硬碟機 (稱為 H-HDD) 的功能。H-HDD 是具有內嵌靜態 Flash 記憶體 (也稱為 NVRAM) 的磁碟。標準的 H-HDD 包含介於 50MB 到 512MB 之間的快取,不過 Windows Vista 的快取限制是 2TB。

Windows Vista 會使用 ATA-8 命令,來定義要保存在 Flash 記憶體中的磁碟資料。例如,Windows Vista 會在系統關機時將開機資料儲存到快取中,以允許更快的重新啟動。它也會在系統休眠時將部分休眠檔案資料儲存在快取中,以加快後續的恢復執行。由於即使當磁 碟處於關閉狀態時,快取依然啟用,因此 Windows 可以使用 Flash 記憶體做為磁碟寫入快取,這可避免磁碟在系統使用電池電力執行時啟動。保持磁碟的磁針關閉可以節省磁碟機在正常使用下所消耗的大部分電力。


開機設定資料庫

Windows Vista 增強了啟動和關機的許多層面。採用開機設定資料庫 (BCD) 儲存系統和作業系統啟動設定、新的系統啟動程序的流程和組織、新的登入架構,以及支援延遲自動啟動服務,這些都改進了開機。Windows Vista 的關機變更包括 Windows 服務的預先關閉通知、Windows 服務關閉順序,以及 OS 管理電源狀態轉換方式的重大變更。

啟 動程序最明顯的變更就是系統磁碟區的根目錄中沒有 Boot.ini。這是因為在舊版 Windows 中儲存在 Boot.ini 文字檔案中的開機設定,現在都儲存在 BCD 中。Windows Vista 使用 BCD 的原因之一,是它合併了 Windows 所支援的兩個目前開機架構:主開機記錄 (MBR) 和可延伸韌體介面 (EFI)。MBR 通常是由 x86 和 x64 桌上型系統使用,而 EFI 則是由 Itanium 系統使用 (不過桌上型 PC 可能很快就會包含 EFI 支援)。BCD 會摘要韌體,也擁有比 Boot.ini 好的其他優點,例如支援 Unicode 字串和替代的預先開機可執行檔。

BCD 實際上是儲存在磁碟上的登錄 Hive 中,此 Hive 會載入 Windows 登錄以便透過登錄 API 存取。在 PC 上,Windows 會將它儲存在系統磁碟區的 \Boot\Bcd 中。在 EFI 系統上,則是儲存在 EFI 系統磁碟分割中。Hive 載入之後,會在 HKLM\Bcd00000000 底下顯示,但是並未記載其內部格式,因此若要編輯,就需要使用 %SystemRoot%\System32\Bcdedit.exe 之類的工具。也透過 Windows Management Instrumentation (WMI) 提供操作 BCD 之指令碼和自訂編輯器的介面,而且您可以使用 Windows 系統設定公用程式 (%SystemRoot%\System32\Msconfig.exe) 編輯或加入基本參數,例如核心偵錯選項。

BCD 會將全平台的開機設定 (例如預設 OS 選取和開機功能表逾時) 與 OS 特定的設定 (例如 OS 開機選項和開機載入器的路徑) 分開。例如,[圖 3] 顯示當您執行 Bcdedit,但是未加上命令列選項時,它會在輸出的最前面區段中,顯示 Windows 開機管理程式 (Windows Boot Manager) 的平台設定,隨後則包括 Windows 開機載入器 (Windows Boot Loader) 區段的 OS 特定設定。

Figure 3 Settings displayed in BCDEdit (Click the image for a larger view)

當您將 Windows Vista 安裝開機時,此新配置會將以往舊版 Windows 系統上由作業系統載入器 (Ntldr) 所處理的工作分割到兩個不同的可執行檔中:\BootMgr 和 %SystemRoot%\System32\Winload.exe。Bootmgr 會讀取 BCD 並顯示 OS 開機功能表,而 Winload.exe 則會處理作業系統載入。如果您是執行正常開機,Winload.exe 就會載入開機啟動裝置驅動程式和核心作業系統檔案,包括 Ntoskrnl.exe,並會將控制權轉移給作業系統;如果系統是從休眠狀態恢復執行,則它會執行 %SystemRoot%\System32\Winresume.exe,將休眠資料載入記憶體中並恢復執行 OS。

Bootmgr 也包含其他預先開機可執行檔的支援。Windows Vista 預先設定了 Windows 記憶體診斷 (\Boot\Memtest.exe) 做為檢查 RAM 健康狀態的選項,但是協力廠商可能加入自己的預先開機可執行檔,做為將在 Bootmgr 開機功能表中顯示的選項。


啟動程序

在 舊版的 Windows 中,各種系統處理程序之間的關係並不是很清楚。例如,在系統開機時,互動式登入管理程式 (%SystemRoot%\System32\Winlogon.exe) 會啟動本機安全性授權子系統服務 (Lsass.exe) 和服務控制管理員 (Services.exe)。此外,Windows 會使用稱為「工作階段」的名稱空間容器,來隔離在不同登入工作階段中執行的處理程序。但是在 Windows Vista 之前,使用者是登入主控台共用工作階段 0 (系統處理程序所使用的工作階段),這造成潛在的安全性問題。例如,當時有一個編寫不良的 Windows 服務就是在工作階段 0 執行,且該服務會在互動式主控台上顯示使用者介面視窗,使惡意程式有機可乘 (可能透過毀壞攻擊等技巧攻擊視窗並取得系統管理員特殊權限),而造成安全性的問題。

為了處理這些問題, 許多系統處理程序都已針對 Windows Vista 重新設計。如同舊版的 Windows 一樣,工作階段管理員 (Smss.exe) 會是開機過程中所建立的第一個使用者模式處理程序,但是在 Windows Vista 中,工作階段管理員會啟動本身的第二個例項,以設定工作階段 0 (完全由系統處理程序專用)。工作階段 0 的工作階段管理員處理程序會啟動 Windows 啟動應用程式 (Wininit.exe)、工作階段 0 的 Windows 子系統處理程序 (Csrss.exe),然後就會結束。Windows 啟動應用程式會繼續啟動服務控制管理員、本機安全性授權子系統,以及一個新的處理程序 (本機工作階段管理員 (Lsm.exe)),此處理程序負責管理電腦的終端機伺服器連線。

使用者登入系統時,初始的工作階段管 理員會建立其本身的新例項,以設定新工作階段。新的 Smss.exe 處理程序會為新的工作階段啟動 Windows 子系統處理程序和 Winlogon 處理程序。讓主要的工作階段管理員使用本身的複本來初始化新工作階段並不會為用戶端系統提供任何好處,但是在做為終端機伺服器的 Windows Server "Longhorn" 系統上,多個複本可以同時執行,以允許多位使用者更快的登入。

有 了此新的架構,系統處理程序 (包括 Windows 服務) 都隔離在工作階段 0 中。如果在工作階段 0 執行的 Windows 服務顯示使用者介面,互動式服務偵測服務 (%SystemRoot%\System32\UI0Detect.exe) 就會在使用者的安全性內容中啟動本身的一個例項,以通知任何已登入的系統管理員,並顯示 [圖 4] 所示的訊息。如果使用者選取 [顯示訊息] 按鈕,服務就會將桌面切換至 Windows 服務桌面,使用者可以在此和服務的使用者介面互動,然後切換回其自己的桌面。如需啟動時執行之作業的詳細資訊,請參閱資訊看板<檢視啟動程序的關係>。


Figure 4 Service has displayed a window (Click the image for a larger view)

檢視啟動程序的關係

您可以使用 Sysinternals (microsoft.com/technet/sysinternals) 的 Process Explorer,來檢視 Windows Vista 的處理程序啟動樹狀目錄。

擷 取畫面包含 [Session] 資料行,您可以透過 Process Explorer 的資料行對話方塊加入此資料行。反白的處理程序是初始的 Smss.exe。其下面是工作階段 0 Csrss.exe 和 Wininit.exe,這兩者都會靠左對齊,因為其父系處理程序 (也就是設定工作階段 0 之 Smss.exe 的例項) 已經結束。Wininit 的三個子系為 Services.exe、Lsass.exe 和 Lsm.exe。

Process Explorer 會將一組處理程序識別為在工作階段 1 中執行,而這也是我透過遠端桌面連線登入的工作階段。Process Explorer 會以藍色反白顯示使用和其本身相同之帳戶執行的處理程序。最後,會初始化工作階段 2 以準備讓使用者登入主控台,並建立新的登入工作階段。Winlogon 就是在這個工作階段中執行,並使用 LogonUI 要求新的主控台使用者「按 Ctrl+Alt+DELETE 以登入」,而 Logonui.exe 也會在此要求使用者提供認證。

Startup process and session information (Click the image for a larger view)

認證提供者

Windows Vista 連登入架構都變更了。舊版的 Windows 中,Winlogon 處理程序會載入登錄中指定的 Graphical Identification and Authentication (GINA) DLL,以顯示登入 UI,要求使用者提供認證。很可惜,GINA 模型有諸多的限制,包括只能設定一個 GINA、協力廠商很難撰寫完整的 GINA,以及使用非標準使用者介面的自訂 GINA 會變更 Windows 的使用者經驗。

Windows Vista 使用新的認證提供者架構來代替 GINA。Winlogon 啟動另一個處理程序,亦即登入使用者介面主機 (Logon User Interface Host (Logonui.exe)),它會載入在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Authentication\Credential Providers 中設定的認證提供者。Logonui 可以同時裝載多個認證提供者;事實上,Windows Vista 附有互動式 (Authui.dll) 和智慧卡 (Smart-cardcredentialprovider.dll) 提供者。為了保證一致的使用者經驗,LogonUI 會管理向使用者顯示的使用者介面,不過它也允許認證提供者指定文字、圖示和編輯控制項之類的自訂元素。


延遲自動啟動服務

如 果您曾經在 Windows 系統啟動後立即登入系統,很可能遇到過必須經過一段延遲,您的桌面才會完全設定好,您也才能與 Shell 和您所啟動的任何應用程式互動。在您登入時,服務控制管理員會啟動許多設定為自動啟動 (因此會在開機時啟用) 的 Windows 服務。許多服務的初始化作業,都需要大量使用 CPU 和磁碟資源,這會和您的登入活動競爭資源。為了解決這個問題,Windows Vista 引進新的服務啟動類型,稱為延遲自動啟動,不需要在 Windows 開機後立即作用的服務可以使用此功能。

服 務控制管理員會在自動啟動服務完成啟動之後,再啟動設定為延遲自動啟動的服務,並將其初始執行緒優先順序設定為 THREAD_PRIORITY_LOWEST。此優先順序層級會使執行緒執行的所有磁碟 I/O 成為「非常低」I/O 優先順序。服務完成初始化之後,服務控制管理員就會將其優先順序設定為標準。延遲啟動、低 CPU 和記憶體優先順序,以及背景磁碟優先順序的組合,可大為減少使用者登入時的負面影響。許多 Windows 服務,包括背景智慧型傳送、Windows Update 用戶端及 Windows Media® Center,都使用新的啟動類型,以協助改善開機後的登入效能。


關機

困 擾 Windows 服務撰寫人員的一個問題,就是在 Windows 關機過程中,預設最多只有 20 秒的時間執行清除。Windows Vista 之前的 Windows 版本並未支援等待所有服務都結束的正常關機,因為設計不良的服務可能會無限期地阻礙關機。某些服務 (例如具有網路相關關機作業或必須將大量資料儲存至磁碟的服務) 可能需要較多的時間,因此 Windows Vista 允許服務要求預先關閉通知。

Windows Vista 關機時,服務控制管理員會先通知那些要求預先關閉通知的服務。它會無時間限制地等候這些服務結束,但是如果服務有錯誤,且並未回應查詢,服務控制管理員就 會放棄,並在三分鐘後結束。等到所有服務都結束,或者等待時間已過期,服務控制管理員就會針對其餘服務繼續執行舊式服務關閉。群組原則和 Windows Update 服務會在新的 Windows Vista 安裝中登錄預先關閉通知。

群 組原則和 Windows Update 服務也會使用另一項 Windows Vista 服務功能:關閉順序。服務一直都可以指定啟動依存性,服務控制管理員會尊重這些依存性,以能夠滿足服務的順序來啟動服務,但是在 Windows Vista 之前,服務並無法指定關閉依存性。現在,登錄預先關閉通知的服務也可以將自己插入至儲存在 HKLM\System\CurrentControlSet\Control\PreshutdownOrder 的清單中,而服務控制管理員將根據服務的順序來關閉。如需這些服務的詳細資訊,請參閱資訊看板<識別延遲自動啟動和預先關閉服務>。


電源管理

睡眠和休眠是其他形式的關機,自從 Windows 2000 將電源管理引進 Windows NT® 系列的 Windows 作業系統後,驅動程式和應用程式中設計不良的電源管理就一直是行動電腦使用者的困擾。許多使用者都希望當他們在旅途中登機前蓋上膝上型電腦的蓋子時,系統 能夠進入暫停或休眠狀態,但是等他們到達目的地後,卻發現只是徒勞帶著一個發熱的箱子、電池已沒電,且資料已遺失。這是因為 Windows 一律會要求裝置驅動程式和應用程式同意變更電源狀態,而只要有一個驅動程式或應用程式沒有回應,都會妨礙轉換。

在 Windows Vista 中,核心的電源管理員一樣會通知驅動程式和應用程式電源狀態的變更,以便這些程式能準備好,但是它不會再要求同意。此外,電源管理員會等候 (最多 20 秒) 應用程式回應變更通知,而不是在舊版 Windows 中的等候兩分鐘。因此,Windows Vista 使用者可以更確定其系統會執行休眠和暫停。


接下來

前 面已提過,這是三篇一系列文章的第二篇。第一篇討論的是 Windows Vista 核心在 I/O 與處理程序方面的改進。本篇則探討了 Windows Vista 在記憶體管理、啟動和關機方面的增強功能。下一篇我會介紹可靠性和安全性方面的核心變更,為整個系列劃下句點。


識別延遲自動啟動和預先關閉服務

Windows Vista 更新了內建 SC 命令,以顯示設定為延遲自動啟動服務的服務:

Using SC to display start type (Click the image for a larger view)

可惜的是,SC 命令並不會報告已要求預先關閉通知的服務,不過您可以使用 Sysinternals 的 PsService 公用程式,以檢視服務是否接受預先關閉通知:

Viewing pre-shutdown status (Click the image for a larger view)

Related Articles From TechNet Magazine: