作業系統(4)執行緒及其實現

笨蛋糕發表於2014-03-02

1、在windows中,處理器的排程物件是執行緒,作為系統排程和分派的基本單位,執行緒會被頻繁地排程和切換。執行緒是程式中能夠併發執行的實體,是程式的組成部分。

執行緒的組成部分有:

1)執行緒的唯一識別符號及執行緒狀態資訊。

2)未執行時所儲存的執行緒上下文,可以把執行緒看作程式中一個獨立的程式計數器。

3)核心棧,在核心態工作時儲存引數,在函式呼叫時的返回地址,等等。

4)用於存放執行緒區域性變數和使用者棧的私有儲存區。

2、程式可以分為兩個部分:資源集合和執行緒集合。

程式要支撐執行緒的執行,為執行緒提供地址空間和各種資源,程式封裝管理資訊,包括對指令程式碼、全域性資料、開啟的檔案和訊號量等共享部分的管理;執行緒封裝執行資訊,包括對CPU、暫存器、執行棧(使用者棧和核心棧)和區域性變數、過程呼叫引數、返回值等私有部分的管理。

3、執行緒狀態:

由於執行緒不是資源的擁有單位,掛起狀態對於執行緒是沒有意義的。程式的終止將導致其中所有執行緒的終止。掛起狀態屬於不可執行態。使用者可以通過SuspendThread和ResumeThread函式來掛起和啟用執行緒。

執行緒庫可分為使用者空間執行緒庫和核心空間執行緒庫,執行緒庫實際上是多執行緒應用程式的開發和執行環境。

4、一個程式可以包含若干執行緒,這些執行緒有多種組織方式,一種是排程員-工作者模式,一種是組模式,一種是流水線模式。

多執行緒技術主要應用包括:前臺和後臺工作,客戶-伺服器應用模式,任務非同步處理,使用者介面設計等。

5、多執行緒的實現分為三類:

使用者級執行緒ULT:由使用者空間的執行緒庫來完成,應用程式通過執行緒庫進行設計,再與執行緒庫連線、執行以實現多執行緒。

核心級執行緒KLT:由核心鎖提供的執行緒API來使用執行緒,核心需要為程式及程式中的單個執行緒維護現場資訊。

混合方式:一個應用程式中的多個使用者級執行緒能分配和對應於一個或多個核心級執行緒,核心級執行緒可同時在多處理器上並行執行,且在阻塞一個使用者級執行緒時,核心可以排程另一個執行緒執行。視窗系統是典型的邏輯並行性程式較高的應用。

6、程式和執行緒均通過物件來實現。Win32程式由三個部分組成:

虛擬地址空間描述符VAD:描述程式地址空間各部分屬性,用於虛存管理。

執行緒塊列表:包含程式中所有執行緒的相關資訊,供排程器控制CPU的分配和回收。

物件控制程式碼列表:當程式建立或開啟物件時,將得到一個代表此物件的控制程式碼,用於物件的訪問,此列表維護程式正在訪問的所有物件。

7、物件及物件管理器:

windows是一個基於物件的作業系統,用物件來表示所有系統資源,可以認為i物件類就是資源類。定義兩大類物件有:

1)執行體物件:用來實現各種外部功能。

2)核心物件:對使用者態程式碼是不可見的,僅在執行體內部建立和使用。

windows物件由物件頭和物件體組成。物件頭由物件管理器控制,各執行體元件控制自己建立的物件型別的物件體。每個物件頭都指向開啟此物件的程式列表,同時還有一個稱為型別物件的特殊物件,其所包含的資訊對每個物件例項是公用的。

8、控制程式碼是一個32位二進位制數,使用者執行緒以此來引用執行體物件。物件頭包含控制程式碼引用計數,用來記錄物件被引用的次數。若控制程式碼引用次數為0,系統會釋放物件。

9、程式物件:

其屬性包括程式標識、訪問令牌、程式基本優先順序和預設的親合處理器集合等。程式是對應於儲存器、開啟檔案表等資源的應用程式實體。執行緒是執行工作時的排程單位,並且可以被中斷,這樣處理器可以被其他執行緒所佔用。

1)核心程式塊KPROCESS。2)程式識別符號。3)配額限制。4)主存管理資訊。5)工作集資訊。6)虛擬主存資訊。7)異常/除錯埠。8)訪問令牌。9)物件控制程式碼表。10)程式環境塊PEB。

10、當應用程式呼叫CreateProcess( )函式時,將建立一個Win32程式,建立過程在作業系統的3個部分中分階段完成,它們是:Win32客戶端的KERNEL32.DLL、Windows執行體和Win32子系統程式CSRSS。

執行步驟如下:

1)開啟將在程式中執行的.exe映像檔案;

2)建立Windows執行體程式物件,申請並初始化EPROCESS,建立並初始化KPROCESS和程式環境塊,向程式分配地址空間;

3)建立主執行緒(堆疊、描述表、執行體執行緒物件);

4)向Win32子系統通知建立程式和執行緒的控制程式碼,以便初始化新的程式或執行緒;

5)在新程式和執行緒描述表中,完成地址空間的初始化,載入所需的動態連結庫;啟動初始執行緒執行。

11、執行緒物件:

每個執行緒都由一個執行緒描述表來表示,在程式描述表EPROCESS的KPROCESS中包含struct LIST_ENTRY ThreadListHead域,它指向一組執行緒描述表,稱為ETHREAD結構。

執行體執行緒塊ETHREAD描述執行緒的基本屬性:

1)核心執行緒塊KTHREAD。2)程式標識和指向執行緒所屬程式EPROCESS的指標。3)訪問令牌和執行緒類別(客戶執行緒或伺服器執行緒)。4)LPC訊息資訊。5)I/O請求資訊。

注意:應用程式呼叫CreateThread( )函式建立一個Win32執行緒的具體步驟如下:

1)在程式的地址空間中為執行緒建立使用者態堆疊;初始化執行緒描述表;

2)呼叫NtCreateThread( )建立執行體執行緒物件,內容包括:增加程式中執行緒計數;建立並初始化執行體執行緒塊;生成新執行緒ID;從非頁交換區分配執行緒的核心堆疊;設定執行緒環境塊TEB;設定執行緒的起始地址和使用者指定的Win32起始地址;設定KTHREAD塊;設定指向程式訪問令牌的指標和建立時間;

3)通知Win32子系統已經建立新執行緒,以便Win32子系統設定新的程式和執行緒;

4)設定新執行緒為準備態,將其控制程式碼和ID返回到呼叫程式;呼叫ResumeThread( ),啟用執行緒並排程執行。 

12、執行緒的7種狀態:

就緒態、準備態、執行態、等待態、過渡態、終止態、初始態。





相關文章