1. 程式人生 > >深入理解作業系統原理之Windows程序管理

深入理解作業系統原理之Windows程序管理

一、Windows 2000的基元成分

物件、程序、執行緒是Windows2000三個基元成份,它們之間有互相交叉的關係。

1、物件

物件是一個抽象的資料結構,在Windows2000中用以表示廣義的資源。它是構成OS的三個基元成份中非活動的成份,物件是資料和有關操作的封裝體,它包裝資料、資料的屬性以及可以施加於資料的操作等三個成份。具有相同特性的物件也可歸為一個物件類,在軟體設計中定義了物件類(稱為類Class),而物件則是物件類一個具體實現的示例。物件作為抽象資料而封裝在其內部的操作函式所提供的操作也給人活動成份的感覺,但是從作業系統這一角度來認識,物件是構成作業系統的非活動成份。而程序和執行緒則是構成OS的兩個活動成份。

Windows 2000中的實體,當資料或資源對使用者態開放時,或者當資料訪問是共享的或受限制時,才使用物件。採用物件方法表示的實體有檔案、程序、執行緒、訊號量、互斥量、事件、計時器等。Windows 2000通過物件管理器以一致的方法建立和管理所有的物件型別,物件管理器代表應用程式負責建立和刪除物件,並負責授權訪問物件的資料和服務。
這裡寫圖片描述
每一個物件都有一個物件頭和一個物件體。物件管理器控制物件頭,各執行體元件控制它們自己建立的物件型別的物件體。當程序通過名稱來建立或開啟一個物件時,它會收到一個代表程序訪問物件的控制代碼。所有使用者態程序只有獲得了物件控制代碼之後才可以使用這個物件。控制代碼作為系統資源的間接指標來使用,這種不直接的方式阻止了應用程式對系統資料結構直接地隨便操作。

2、程序

Windows2000中程序被定義為表示OS所要做的工作,是OS用於組織其必須完成諸工作的一種手段。NT中的程序由一個可執行的程式、一個私用的虛地址空間、系統資源和至少一個執行執行緒等四部分組成。
這裡寫圖片描述
NT的程序概念與傳統OS程序概念有所不同,NT程序是作為物件來實現,因此從廣義角度來說,程序也是共享的資源(多個使用者程序可共享伺服器程序提供的服務)。

NT定義了一個程序物件類,程序的物件類的物件體和所包含的屬性定義了程序物件的資料及其屬性和施加其上的操作(服務),但描述程序組成的兩個主要部分:程序地址空間和侷限於程序的物件表,不包含在屬性表中,因為它是附屬的、不可見的。NT程序要求一個獨特的組成成分:至少一個執行執行緒,這在傳統OS中是沒有的。NT程序的組成中沒有程序控制塊,有關程序的資訊在程序物件的物件體中以及侷限於程序的物件表中。
這裡寫圖片描述

3、執行緒

NT的執行緒是程序內的一個執行單元,是程序內的一個可排程實體。一個執行緒是由唯一的識別符號客戶ID、描述處理器狀態的一組狀態暫存器的內容、使用者棧和核心棧、一個私用存貯器等四部分組成,執行緒也是作為物件來實現。每個程序建立時只有一個執行緒,需要時這個執行緒建立其它執行緒。線性是程序的一個組成部分,一個NT程序可以有多個執行緒在其地址空間內執行。資源分配的單位是程序,排程和執行的基本單位是執行緒。
這裡寫圖片描述

二、Windows程序控制API函式

1、CreateProcess函式

當一個執行緒呼叫CreateProcess時,系統就會建立一個程序核心物件,為新程序建立一個虛擬地址空間,並將可執行檔案載入到該程序的地址空間中。然後系統再為新程序的主執行緒建立一個執行緒核心物件。通過執行啟動程式碼,該主執行緒便開始執行,它最終呼叫WinMain、wWinMain、main或wmain函式。如果系統成功地建立了新程序和主執行緒,該函式便返回TRUE。

2、CreateThread函式

CreateThread函式建立一個在呼叫程序的地址空間中執行的執行緒。
格式:

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD  dwStacksize, LPTHREAD_START_ROUTINE lpStartAddress, 
LPVOID tpParameter, DWORD dwCreationFlags, LPDWORD lpThreadld);

lpThreadAttributes:指向一個SECURITY_ATTRIBUTES結構,該結構決定了返回的控制代碼是否可被子程序繼承。若lpThreadAttributes為NULL,則控制代碼不能被繼承。
dwStackSize:定義原始堆疊提交時的大小(按位元組計)。系統將該值舍入為最近的頁。若該值為0,或小於預設時提交的大小,預設情況是使用與呼叫執行緒同樣的大小。
lpStartAddress:指向一個新執行緒執行的LPTHREAD_START_ROUTINE型別應用定義的函式。該指標還表示遠端程序中執行緒的起始地址。該函式必須存在於遠端程序中。
lpParameter:定義一個傳遞給該新執行緒的32位值。
dwCreationFiags:定義控制執行緒建立的附加標誌。若定義了CREATE_SUSPENDED標誌,執行緒建立時處於掛起狀態,並且直到ResumeThread函式呼叫時才能執行。若該值為0,則該執行緒在建立後立即執行。
lpThreadId:指向一個32位值,它接收該執行緒的識別符號。
返回值:若函式呼叫成功,返回值為新執行緒的控制代碼;若函式呼叫失敗, 返回值為NULL。

3、ExitThread函式

ExitThread函式結束一個執行緒。
格式:

VOID ExitThread ( DWORD dwExitCode ) ;

dwExitCode:定義呼叫執行緒的退出程式碼。使用GetExitCodeThread函式來檢測一個執行緒的退出程式碼。
返回值:無。
SuspendThread()函式用於掛起指定的執行緒。
ResumeThread()函式遞減指定執行緒的掛起計數,掛起計數為0時,執行緒恢復執行。

4、互斥物件函式

在windows2000中提供了互斥物件、訊號量物件和事件物件等同步物件和相應的系統呼叫,用於程序和執行緒的同步。這些同步物件都有一個使用者指定的物件名稱,不同程序用同樣的物件名稱來建立或開啟物件,從而獲得該物件在本程序的控制代碼。
互斥物件(Mutex)就是互斥訊號量,在一個時刻只能被一個執行緒使用,它用於程序、執行緒間的互斥。它的相關API函式包括:CreateMutex、OpenMutex和ReleaseMutex。

  • CreateMutex
    函式建立一個互斥物件,返回物件控制代碼。
  • OpenMutex
    函式為現有的一個已命名互斥體物件建立一個新控制代碼。
  • ReleaseMurex
    函式放棄指定互斥物件的所有權。

5、訊號量物件函式

訊號量物件(semaphore)就是資源訊號量,初始值的取值在0到指定最大值之間,用於限制併發訪問的執行緒數,也可用於程序、執行緒間的同步。它的相關API包括:CreateSemaphore、OpenSemaphore和ReleaseSemaphore。

  • CreateSemapore
    函式是建立一個有名或者無名訊號量物件在輸人蔘數中指定最大值和初值,返回物件控制代碼。
  • OpenSemaphore
    函式為現有的一個已命名訊號機物件建立一個新控制代碼。
  • ReleaseSemaphore
    函式釋放對訊號量物件的佔用,將指定訊號物件的計數增加一個指定的數量。

6、等待操作函式

Windows 2000為物件提供了兩個統一的等待操作函式WaitForSingleObjectWaitForMultipleObjiects。等待的物件包括:Change notification(改變通告);Console input(控制檯輸入);Event(事件);Job(作業);Mutex(互斥物件);Process(程序);Semaphore(訊號量);Thread(執行緒);Waitable timer(可等待定時器)。函式決定等待條件是否被滿足。如果等待條件並沒有被滿足,呼叫執行緒進入一個高效的等待狀態,當等待滿足條件時佔用非常少的處理器時間。在執行前,一個等待函式修改同步物件型別的狀態。修改僅發生在引起函式返回的物件身上。例如,訊號的計數減1。一個執行緒通過呼叫等待函式擁有物件。建立該物件的執行緒也擁有物件,而不需要呼叫等待函式。

7、臨界區物件函式

臨界區物件只能用於在同一個程序內使用的臨界區,同一個程序內各執行緒對它的訪問是互斥進行的。把變數說明為CRITICAL_SECTION型別,就可作臨界區使用。相關的API包括InitializeCriticalSection、EnterCriticalSection、TryEnterCriticalSection、LeaveCriticalSection和DeleteCriticalSection。

  • InitializeCriticalSection
    函式初始化臨界區物件。
  • EnterCriticalSection
    函式是等待指定臨界區物件的所有權。當呼叫執行緒被賦予所有權時,該函式返回。
  • TryEnterCriticalSection
    函式決不允許呼叫執行緒進入等待狀態。它的返回值能夠指明呼叫執行緒是否能夠獲得對資源的訪問權。TryEnterCriticalSection發現該資源已經被另一個執行緒訪問,它就返回FALSE。在其他所有情況下,它均返回TRUE。運用這個函式,執行緒能夠迅速檢視它是否可以訪問某個共享資源,如果不能訪問,那麼它可以繼續執行某些其他操作,而不必進行等待。
  • LeaveCriticalSection
    函式釋放指定臨界區物件的所有權
  • DeleteCriticalSection
    函式釋放與臨界區物件相關的所有系統資源。

三、Windows 2000內部程序通訊機制

1、本地過程呼叫LPC

Windows 2000的客戶程序與伺服器程序之間的通訊採用訊息傳送,而訊息傳送必須經過執行體的本地過程呼叫LPC。LPC是一個用於高速資訊傳輸的程序間的通訊機構,LPC是一個靈活的、經過優化的“遠端過程呼叫”(RPC)版本,(RPC是一種通過網路在客戶與伺服器程序之間傳遞資訊的工業標準通訊機制),在Win32 API下它是不可用的,它是一個只對Window 2000作業系統元件有效的內部機制。LPC被使用在一個伺服器程序與該伺服器的一個或多個客戶程序之間。LPC提供了三種不同的訊息傳送方法:

第一種方法適用於傳送小於256B的訊息。它將訊息傳給與伺服器程序相連的埠物件,系統為每個埠物件設定有一個固定大小的訊息佇列,作為通訊之用,此方法用於傳送少於256位元組的資訊。這個方法類同於訊息緩衝佇列通訊機制。

第二種方法適用於傳送大於256B的訊息。它將訊息指標傳給與伺服器程序相連的埠物件,並把訊息存放在共享的主存區域中,訊息大小受程序所分得的主存配額限制。訊息傳送的過程如下:當客戶要傳送大訊息時,就由它自己建立一個稱為主存區域的物件-主存共享的物件,LPC機制使得該地址空間為客戶程序和伺服器均可見,然後客戶程序把大訊息存放在該主存區域物件中;再向服務的的埠物件的訊息佇列中傳送一個小訊息指出所傳送訊息的大小和訊息所在的地址指標。

第三種方法適用於伺服器想讀或寫大量資料而共享區又太小情況。資料可以直接從客戶地址空間讀出或向客戶地址間寫入。LPC元件提供了兩個函式,伺服器可以用它們來完成這些操作,以第一種方法傳送的訊息被用於同步正在傳送的資訊。

LPC典型地應用於以下情況:伺服器建立已命名的伺服器直接埠物件。客戶提出與這個埠連線的請求。如果同意該請求,客戶通訊埠和伺服器通訊埠就會被建立。客戶得到客戶通訊埠的控制代碼,伺服器得到伺服器通訊埠控制代碼。然後客戶和伺服器將為了它們之間的通訊使用新的埠。

2、多級反饋佇列排程演算法

Windows2000採用可搶佔動態優先順序多級反饋就緒佇列排程演算法,Windows2000的排程單位是執行緒。2000執行體支援32級優先順序,並將它們分成兩類,實時優先順序(16-31)和可變優先順序(1-15),0級為系統保留,執行一個僅用於對系統中空閒物理頁面進行清頁的零頁執行緒。每個優先順序一個就緒佇列,高序號佇列為高優先順序。實時優先順序採用多級佇列排程演算法;可變優先順序採用多級反饋佇列排程演算法,每個執行緒優先順序變化範圍是5級,可變優先順序又分為高階、中上、中級、中下和空閒五類。
這裡寫圖片描述

執行緒完整用完一個規定的時間片值時,重新賦予新時間片值時,優先順序降一級(不低於基本優先順序),放在相應優先順序就緒佇列的尾部;
這裡寫圖片描述

執行緒由於呼叫等待函式而阻塞時,減少一個時間片,並依據等待事件型別提高優先順序;如等待鍵盤事件比等待磁碟事件的提高幅度大。
這裡寫圖片描述
在下列5種情況下,Windows 2000會提升執行緒的當前優先順序:

  • I/O操作完成
  • 訊號量或事件等待結束
  • 前臺程序中的執行緒完成一個等待操作
  • 由於視窗活動而喚醒圖形使用者介面執行緒
  • 執行緒處於就緒狀態超過一定時間,但沒能進入執行狀態(處理機飢餓)

執行緒優先順序提升的目的是改進系統吞吐量、響應時間等整體特徵,解決執行緒排程策略中潛在的不公正性。但它也不是完美的,它並不會使所有應用都受益。Windows 2000永遠不會提升實時優先順序範圍內(16至31)的執行緒優先順序。

四、作業系統結構設計

1、作業系統採用結構程式設計的必要性

由於作業系統日趨龐大,結構日益複雜,錯誤增加以至不可避免。在以後每個新版中都糾錯。其次由於作業系統存在併發性,程序間執行序列數量巨大,推進序列不確定性,程式錯誤的某種表現形式不重複出現,可能使人誤解為一次偶然性機器的故障。這給作業系統除錯帶來了困難。為了使作業系統高可靠、高效能、可理解和可修改,作業系統必須採用結構程式設計方法。

2、模組介面法

模組介面法是OS最早採用的一種結構程式設計方法,早期作業系統(IBM的OS)和小型OS(如MS-DOS)均屬此型別。模組介面法把一個系統按功能分成若干個具有一定獨立性和大小完成某方面功能的模組,並規定好各模組之間的介面。接著在明確每個模組的內部功能的基礎上對它們進行獨立設計。最後在各模組設計完成後按照模組間的介面關係,將所有模組逐步連結成一個大系統。

模組介面法的優點是使OS設計實現模組化的基本結構程式設計方法,它增加了OS靈活性,便於修改和維護。但由於模組部介面複雜,使得系統的結構關係不清晰,因而使系統的可靠性降低。故又稱模組介面法為無序模組法。

3、層次結構法

為了減少各模組之間無序調動、互相依賴關係,特別是清除迴圈現象,引入層次結構設計法。它將模組間無序呼叫變為有序呼叫,它把OS的所有功能模組,按功能流圖的呼叫次序,排列成若干層,各層之間的模組只能是單向呼叫關係,即是隻允許上層模組呼叫相鄰下層模組。這樣作業系統的結構清晰,而不構成迴圈,使系統的除錯和驗證變得容易。

層次結構法採用自底向上法形成作業系統。它先在裸機上新增第一層精心編制的軟體,形成比原來機器功能更強的機器,稱為虛擬機器A1。再經過幾乎是窮盡無遺的測試後,就有較大把握確信虛擬機器A1是正確的。然後,再在A1上增加一層精心編制的軟體,形成功能更強、更接近於實際要求的虛擬機器A2,再經過幾乎是窮盡無遺的測試, …… ……如此一層一層地自底向上地鋪設各軟體層,每一層都實現若干功能,最後構成滿足要求的虛擬機器An。因此只要下層各模組設計是正確的,就為上層功能模組的設計提供了可靠基礎,從而增加了系統的可靠性。

1968年Dijkstra在ELX8機器上編制的作業系統THE中採用各層間單向依賴,層內各模組互相獨立的全序的層次關係設計。但該系統通訊開銷大,系統經過層層呼叫效率低,該設計方法不適用大型OS。在大層OS中要建立一個全序的層次結構關係是十分困難,往往無法避免迴圈現象。因些層次結構設計應作為OS設計的原則,儘可能將作業系統各功能模組排成有序層次,以便儘量減少系統中迴圈現象。

4、客戶-伺服器方式

作業系統結構技術的發展是與整個計算機技術的發展相聯絡的。當前技術發展的突出特點是要求廣泛的資訊和其它資源的共享,這一要求促使網路技術的普遍應用和發展。由於網路技術逐漸成熟,並實用化,再加以資料庫聯網已是應用的新趨勢,為使用者提供一個符合企業資訊處理應用要求的分散式處理的系統環境是應用潮流的需要。作業系統採用客戶/伺服器結構,它將非常適應於分散式處理的計算機環境中,所以說C/S模式是第三代作業系統。

客戶/伺服器C/S結構的思想是把作業系統分成核心和若干個程序。核心執行在核心態,負責排程、原語操作和中斷處理等作業系統基本功能。每個程序實現單個的一套服務(例如:主存服務、程序生成服務等),稱為伺服器程序。每個服務執行在使用者態,它執行一個迴圈以檢查是否有客戶已請求某項服務。而客戶可以是另外的作業系統成分,也可以是應用程式。客戶通過傳送一個訊息給伺服器程序來請求提供一項服務。作業系統核心把該訊息傳送給伺服器程序,而後該伺服器執行有關的操作,操作完成後,核心用另一個訊息把結果返回給客戶程序。C/S結構模式的作業系統有卡內基.梅隆大學研製的Mach 作業系統和美國微軟公司研製的WindowsNT作業系統。

5、微核心模式

對於一些專用的系統,主要是實時系統和“嵌入式”系統, “微核心”的思想就很有吸引力。究其原因,主要是因為通常這些系統都不帶磁碟,整個系統都必須放在EPROM中,常常受到儲存空間的限制,而所需要的服務又比較單一和簡單。所以,幾乎所有的嵌入式系統和實時系統都採用微核心,如PSOS,VxWorks等。
優點:

  • 良好的擴充性:只需新增支援新功能的服務程序即可
  • 可靠性好:呼叫關係明確,執行轉移不易混亂
  • 便於網路服務,實現分散式處理:以同樣的呼叫形式,在下層可通過核心中的網路傳送到遠方伺服器上 (遠地過程呼叫 RPC)。

缺點:將這些服務的提供都放在程序層次上,再通過程序間通訊(通常是報文傳遞)提供服務,勢必增加系統的執行開銷,降低了效率,訊息傳遞比直接呼叫效率要低一些 (但可以通過提高硬體效能來補償 )。

6、NT執行體

執行在核心態核心的WindowsNT稱為NT執行體。NT執行體結構是層次式與微核心的結合,它比UNIX核心小。基本上是一個完整的作業系統,它由一組部件構成,這些部件形成了層次結構。NT最底層是硬體抽象層(HAL),它將NT執行體的其餘部分與執行機器硬體特性隔離開來。NT核心是第二層,它類擬於Mach的微核心,它負責對中斷和異常作出響應;排程執行緒,提供一組基本物件和介面。

NT核心上是一組部件:物件管理程式、安全呼叫監視程式、程序管理程式、本地過程呼叫功能和虛擬記憶體管理程式等。I/O系統內部又分成若干層,它們是由I/O管理程式、檔案系統、高速緩衝儲存管理程式、裝置驅動程式、網路重定向程式和網路伺服器等組成。NT執行體最上層系統服務是NT執行體為使用者態的程序提供的一個介面

7、保護子系統

WindowsNT 作業系統除NT執行體外,作業系統所有的其它部分被分成若干個相對獨立的程序,每一個程序實現一組服務,稱為伺服器程序,它執行在使用者態。使用者態伺服器程序又稱保護子系統。WindowsNT有二類保護子系統:環境子系統和整合子系統。

環境子系統有Win32子系統、OS/2子系統和POSIX子系統幾種,每種子系統為特定的作業系統提供一個API。它為客戶程序提供服務是這樣的:當一個應用程式呼叫其相應的某個API(本系統提供Win32、OS/2、POSIX、16位Windows和MS-DOS等系統的程式設計介面API)時,一個訊息通過NT執行體的本地過程呼叫(LPC)工具,傳送給完成該API程式的伺服器程序-環境子系統。子系統執行API例程、並通過LPC將結果返回應用程式程序。

整合子系統是完成重要作業系統功能的伺服器。這包括安全子系統,網路軟體中的若干部件(工作站服務和網路伺服器服務)。當用戶試圖進入系統時,首先必須進行登入,由安全子系統對使用者進行是否允許其進入和許可權檢查與控制。安全子系統維護著一個有關帳號資訊資料庫,內容包括帳號名、保密字、使用者許可權等資訊。任何非法使用者或非法操作,都被安全系統拒之門外。

這裡寫圖片描述

這裡寫圖片描述