查看單個文章
舊 2004-07-01, 09:35 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 理解Win2000 和 NT4 系統及行程活動

  本講座編號為TNQ 400-02,我是David Solomon,在接下來的兩個小時中我們將討論如何透過外表去觀察Windows 2000和Windows NT 4.0,以便理解其內部執行機制以及如何在系統級別中實現這些機制,同時還將理解在系統中執行的行程。


這個講座的目的在於:當你感覺在NT系統中從效能的立場或從行為的立場上某些事情好像出錯時給予你說明 ;使你能夠更近一些的觀察系統外殼之下的部分並且理解CPU時間如何進行分配。


如果系統執行速度慢,告訴你什麼正在執行、為什麼以及如何從應用程式執行中分離操作系統時間。

  這個講座假設你已經熟悉基本的操作系統概念,如行程的概念、多工作的概念、虛擬記憶體、分頁等等;並且你是一個有經驗的NT用戶——不必是一名系統管理員,但至少應是一個權威的NT用戶。

  這個講座結束後,你將能夠使用一系列不同的工具來觀察行程內部的活動,以便發現哪個文件被開啟、IO操作的來源和目標、哪些動態連接庫(DLL)正在由一個行程使用以及它們是從磁牒上的何處裝入的、有關行程安全性的一些細節。

  像我提到的那樣,本講座的目的之一是能夠解釋CPU時間。因此,如果CPU正在執行,那麼它正在做什麼並且為什麼這樣做呢?
時間花費在那裡以及如何被佔用:是由操作系統、設備驅動程式、執行體還是應用程式所使用呢?理解NT操作系統上執行內容的另一個方面,是知道存在哪些系統行程。


因此,如果某事務正在執行並且它不是由你所執行的,那麼它是NT的一部分。

正在執行的行程的作用是什麼,並且你如何能夠追蹤到其佔用CPU時間的可能原因呢?

其中一個方面是由Windows NT 系統行程組成的Windows NT 服務,有時,正在執行的服務行程向後映射到哪些管理員通過管理界面可以看到的服務並不是非常清楚。

  最後,我們來密切關注存在於系統行程這一非常特殊的行程中的粒度水準,該系統行程包含特殊種類的驅動程式線程執行片段和NT片段,而且,由於這種特殊行程的存在,促使我們務必深入鑽研以理解行程中的哪些片段正在執行及其原因。

  這有為本次講座準備的路線圖。首先我將對有關工具及其來源進行簡明概述。


這將是一堂高度依賴工具的講座,而我將在此使用支持工具包、資源工具箱及Internet上獲取的部分工具。


接著,我們將從三個角度來觀察NT系統活動:首先是行程和線程,接下來是中斷時間及其在NT中的服務與解釋機理,最後,再對系統行程樹進行遍歷。

  最後的題目是一種我們不希望發生、卻又經常遇到的行程活動,即當行程死亡時看到Dr. Watson資訊時的情況。我們將看到是什麼導致了Dr. Watson,你能進一步得到哪些資訊,以及你應如何應對這些輸出。

  首先讓我們先看一看工具。這是一個關於本次講座所使用到工具的總概括。


效能監視器——它理所當然地在對NT系統活動的觀察中發揮關鍵性作用。


我們還將看到一些註冊表鍵。註冊表是NT用來對其自身進行配置的系統資料庫,因此,它包括了有助於理解程序在何處執行、來自何處,以及將服務名稱映射到映像名稱上的資訊。接下來,我們將探究兩個來自於支持工具包中的行程觀察工具……對於初次接觸Windows 2000的人而言,該支持工具包在NT 4.0中並不存在。



曾經有一個NT 4.0資源工具包的有限子集,它與Service Pack 4.0相元件服務並稱作Windows NT資源工具箱支持工具,該工具包在Windows 2000中已經更名為Windows 2000支持工具,以此來消除在它與資源工具之間存在的混淆概念。它是每個Windows NT和Windows 2000銷售版本的組成部分。


它存在於支持工具資料夾中。


它使用一個適當的安裝程序來安裝。它包括了40至50種整合在資源工具包中的工具,但該工具包對Windows 2000用戶而言是至關重要、不可或缺的。我將使用來自資源工具包的兩個工具。



它們是資源工具包所含200多種工具中的一分子,而我將強力推薦,如果你還未曾對資源工具包中的工具進行過瀏覽的話,這兩個工具是支持工具的一套重要附件,通過它們,你將能夠洞悉NT系統並理解其內部活動。

  接下來列出的4個工具來自www.sysinternals.com網站。



你也許已對該網站十分熟悉。它過去稱為NT Internals。

在此我將進入其主頁以使你們看到該網站的面貌。Sysinternals是自由軟體網站,這裡有所有可免費下載的工具。



這些工具中的大多數來源碼也是公開的,這些工具被設計用來透過支持界面獲取有關NT的資訊,而這些資訊往往是通過標準Microsoft工具所不能訪問到的。大多數NT管理員對此十分熟悉,你們將在講座期間看到其中兩個工具的使用情況。



 那麼,讓我們從最基本水準上的行程與線程活動開始,在開始之前,先來定義一下有關術語。行程與線程的區別到底是什麼?行程是執行程序的實例。



例如,當你執行記事本程序(Nodepad)時,你就新增了一個用來容納組成Notepad.exe的程式碼及其所需使用動態連接庫的行程。NT中的每個行程均執行在其專用且受保護的位址空間內。



因此,如果你同時執行記事本的兩個拷貝,該程序正在使用的資料在各自實例中是彼此獨立的。在記事本的一個拷貝中將無法看到該程序的第二個實例開啟的資料。我這裡以沙箱為例進行闡述。

  一個行程就好比一個沙箱。線程就如同沙箱中的孩子們。孩子們在沙箱子中跑來跑去,並且可能將沙子攘到別的孩子眼中,他們會互相踢打或撕咬。


但是,這些沙箱略有不同之處就在於每個沙箱完全由牆壁和頂棚封閉起來,無論箱中的孩子如何狠命地攘沙,他們也不會影響到其它沙箱中的其他孩子。因此,每個行程就像一個被保護起來的沙箱。



未經許可,無人可以進出。這就是NT中強大的記憶體保護模型的形成機制,正是由於這種機理,才使NT明顯區別於Windows 3.1、Windows 95及Windows 98。

  在Windows NT和Windows 2000中,程序、程序實例或者行程對其它行程的執行情況或記憶體空間施加影響是不可能的。兩個行程彼此獲得專用資料或記憶體的唯一途徑就是通過傳輸協定來共享記憶體塊。這是一種協作原則。

  NT執行線程。換言之,線程執行而行程不執行。


每個行程包含單一線程,因此,當你執行記事本時,就產生相應的行程沙箱用來容納程式碼和資料,而一個線程則被新增用以在指向記事本程序的主要入口起點處開始執行程序。



一旦該線程在執行,它就可以新增額外的線程,一個行程的多個線程並行進行調度,這使多線程編程非常複雜,每個線程均共享其所處行程中的專用記憶體空間。因此,在本張幻燈片的闡述中,行程中所顯示的三個線程(都具有同時執行的潛在能力)均對行程中的專用資料或位址空間享有同等的訪問權限,這樣一來,三個線程就必須彼此同步。

  那麼,為什麼要有多線程呢?為什麼程序員選項將程序分割成多個線程呢?有兩個原因:1)它產生了更佳回應性的幻覺。



以Microsoft Word為例。當你進行文件列印時,你就已預設選項了後台列印方式,列印處理會在你繼續編輯我的文件的同時異步進行。

這是如何發生的呢?Word已新增了獨立的線程來進行列印處理,並將列印線程的優先級設定低於處理用戶輸入的線程,由此,給用戶提供了一種幻覺,即應用程式通過將相對優先級指定給不同線程的方式來對用戶做出回應。


但是,你在Win 98和Windows 95中無法得到,而在Windows 2000與Windows NT 4.0中能夠得到的最大好處還在於,如果你工作在多處理器系統中,並且如果有多個線程要執行,這些線程事實上將能夠在可用的處理器上同時執行。



換言之,多線程應用程式能夠自動地執行於可用處理器上,只要:A)該應用程式有一個以上的線程需要同時執行;B)這些線程的優先級支持該應用程式的執行。


換言之,如果有具備更高優先級的線程存在於另一個CPU上……儘管你的應用程式有兩個需要執行的線程,而因為在別的CPU上正執行著更為重要的工作,那麼,也只能一次執行一個線程。

  技巧問題。增加第二個處理器能使單一線程應用程式更快地執行嗎?讓我們設想你有一個非常簡單的計算密集型、單一線程應用程式。它除了做計算工作之外還是做計算工作。增加一個處理器會使該應用程式更快地執行嗎?好吧,你的第一反應是不,但答案卻是肯定的,因為NT也有自身幾個片段作為線程執行。


如大多數操作系統一樣,NT也擁有後台內務管理工作。因此,增加第二個處理器就意味著,當主要的計算密集型應用程式在無須短暫中斷以執行後台操作系統內務處理活動的情況下仍能持續執行時,這類後台內務處理工作將會發生。

  以上就是對行程和線程的簡要描述。當考慮沙箱的規劃時,NT和Windows 2000是一個32位的操作系統。


如果算一下就會知道,32位意味著4GB。預設情況下,NT將這4GB位址空間分割為兩個2GB的位址空間,其中一個分配給用戶行程,另一個則分配給操作系統。換言之,每個行程均提供了一個假想,即該行程擁有一個最大為2GB、且可以載入程式碼或資料的虛擬記憶體空間。



當然,在一部128兆的膝上型電腦上,如果你執行5個將其自身擴展至2GB大小的應用程式,顯然,這些記憶體空間的一個子集在任何時候都存在於實體記憶體中。上述情況都是透明且在後台執行的。


這便是虛擬記憶體無處不在的表現。就像任何使用虛擬記憶體技術的操作系統一樣,Windows 2000僅將那些被行程佔用的記憶體空間片段按其所需地引入實體記憶體之中。再次以記事本為例,當你執行Notepad.exe時,NT並不是在程序開始時就將Notepad.exe全部讀入。它僅將碰巧被主線程執行途徑所參考的可執行程序映像片段讀入。


同理,被記事本使用的動態連接庫也不是在其被使用時即被從磁牒讀入,而只有當這些動態連接庫中的子例程被實際使用時,那些包含所需引用程式碼並存在於磁牒上的動態連接庫片段才會按需求讀入。



 在螢幕的下半部分,2GB的系統沙箱因NT沒有提供介於操作元件和驅動程式之間的保護而顯得頗為引人注目。我相信,你們中許多從事NT系統管理的人都經歷過因程序錯誤和第三方驅動程式而導致的顯示藍色現象, NT也常因這些現象而受到指責,事實上,這是來自於第三方設備驅動程式中的錯誤所導致的,而NT遭受上述指責的原因之一便是因為NT的全部和所有的設備驅動程式都處在同一個沙箱之中。



然而,每個行程都執行在其自身專用且受保護的沙箱之中,並不能影響其它的行程,同理,這些行程也不能影響操作系統,操作系統與驅動程式均存活在同一個沙箱中,而且,在驅動程式與操作系統之間並沒有保護機制。現在,你也許會問,這是為什麼?答案是效能。

這就是每個事實上成功的32位操作系統的體制。

必須將位址空間在驅動程式或操作之間進行切換也許會有很大的效能損失,但這裡應強調注意的是,當增加驅動程式時,這種切換存在的原因之一就是讓所有為驅動程式登記和Windows文件保護而對Windows 2000所進行的擴展均能夠避免或限制管理員在未經全面驗證和測試的情況下向系統沙箱中增加程式碼的偶然機會。

  操作系統行程本質上並不存在。下面我們將會看到一種稱作「系統」的行程。但那並不是指操作系統。在這些行程中,有一些操作系統的片段正在執行,但也有若干執行後台內務處理活動的行程同時存在。


當記事本開啟一個文件時,它產生一個系統使用來開啟磁牒上的文件。這一開啟磁牒文件的工作被產生該請求的記事本線程的上下文完成。



在這種意義上,操作系統執行於記事本行程的內部,而由於操作系統恰恰是一個由那些產生諸如開啟文件、讀取文件、分配虛擬記憶體及新增行程等用戶線程使用的大的子例程庫,故而它也同樣執行於其它每一個行程之中。

  Windows 2000增加了允許將多個行程群集為一個作業的新對象。一個作業由一個或多個共享同一套配額、限制及其它設定的行程組成,而這些設定僅在逐個行程的基礎上可用。



例如,如果你有一個執行於Windows 2000上的Batch Server系統,而且,你想要為某一特定客戶限定其作業中的活動行程數量,這是有可能的——作為作業的一個內容,活動行程限制是可以設定的;再比如,你想設定該作業應使用50兆以上的記憶體,這裡也有辦法來指定該作業可使用的最大記憶體容量,而且,該作業仍將包括執行全面作業片段的若干行程。

  如果你看一看Windows 2000 Server和Windows 2000Advanced Server的話,你或許根本不會注意到作業對象的存在。


這是因為,除非你新增了一個作業對象並使用效能監視器來對它進行觀察,否則,在用戶界面上將不會有任何東西來指示該作業對像已被增加到系統中。


Windows 2000 DataCenter Server將提供一種稱作行程控制管理器的工具,該工具將允許系統管理員新增作業對象,同時,將行程指定給作業對象並為其指定在本張幻燈片上所顯示的限制與配額。


作業對象可謂是為第三方應用程式的使用而定制的Windows 2000基本組成要素。你可以希望批次處理系統一開始就使用作業對象,同樣,行程控制管理器和資料中心也將利用這一內核對象。

  在此,我想提及作業對象的一個方面——調度級別,它對於大規模伺服器而言是非常有趣的,儘管我們不是在談論Windows 2000中線程的調度問題,而關於作業調度級別內容有趣的東西則是它允許對線程執行中的一個重要方面進行控制,要知道,這在Windows NT 4.0中是不能被設定的。


調度級別是從0到9之間的一個數位。5是預設值。



如數值被提高到5以上,調度級別將使行程中的線程在輪到它執行時執行更長的時間;反之,若數值降至5以下,調度級別則將縮短線程的執行時間長度。這就是級別調度,換言之,可以說某一工作佔用了20%的CPU,而另一工作佔用了50%的CPU。在Windows NT 4.0中,這種級別調度是不可達成的。


有人或許認為,「我能夠提高一個行程的優先級,而這樣做將提供給該線程更多的執行時間」,但是,這樣做會把全部執行時間都賦予這個行程。因此,如果你同時執行兩個行程,其中一個行程的優先級高於另一個,它們都將試突執行,而具備更高優先級的行程則基本上佔用100%的CPU。



這種調度級別內容現在允許根據CPU時間的百分比對CPU進行相應的分區,而這在我看來可謂是作業對像所帶來的一個非常令人興奮的能力。

  現在,觀察NT中基本行程和線程資訊的工作有點令人頭痛,這主要是由於能夠顯示關於同一基本資訊(行程列表)的不同子集的工具大量存在。一些工具也顯示在每個行程中存在的線程。



儘管眾多能夠顯示行程和線程列表的工具往往均引用來自同一資料來源的資訊,但這些工具中的每一種也都能顯示其它工具所不能提供的獨一無二的資訊片段。


在此,我們將使用它們中的兩個進行示範,這兩個工具滿足了觀察行程和線程資訊的主要需要,但我也應說明,其它工具也具備相應的功能,只是在本次講座未予採用。



另一個阻礙理解「是什麼正處於執行之中」這一問題的因素是正在執行著的映像的名字,例如,Notepad.exe或許代表著正在執行著的程序名,但也可能並不代表正在執行著的程序名。


換言之,一個可執行文件的名字或許並不能為你指示它是哪個產品的組成部分、它來自於哪個目錄。


因此,系統管理員在Windows 2000系統中觀察行程活動時所應做的基本工作之一便是可執行程序究竟來自磁牒的哪個角落。如果你知道行程存在於哪個程式文件夾中,例如Microsoft Office,或存在於你的Win NT System 32目錄中,如果你還知道那個資料夾是什麼,那麼,你將能夠對該行程出自什麼元件有所認識。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次