執行緒詳細剖析(四)

2022-02-03 22:10:04 字數 2614 閱讀 4038

摘自《c++多核程式設計》

6.3 設定執行緒屬性

存在一些可用來確定執行緒上下文的關於執行緒的資訊。這些資訊用於重建執行緒的環境。令對等執行緒相互之間產生區別的是id、定義執行緒狀態的暫存器組、優先順序和它的棧。這些屬性使得執行緒有了自己的身份。

posix執行緒庫定義了執行緒屬性物件(attribute objec),它封裝了執行緒屬性的乙個子集。這些屬性可以被執行緒的建立者訪問和更改。下面是可以被更改的執行緒屬性:

1)競爭範圍

2)棧大小

3)棧位址

4)分離的狀態

5)優先順序

6)排程策略和引數

範圍屬性描述了哪些執行緒同特定執行緒競爭資源。執行緒在兩個競爭範圍內爭奪資源:

1)程序範圍

2)系統範圍

執行緒依照競爭範圍和分配域(它被指派到的處理器集)來同其他執行緒競爭處理器的使用。有著程序競爭範圍的執行緒同程序中其他執行緒競爭,而有著系統競爭範圍的執行緒同系統分配的其他程序的執行緒競爭資源。有著系統範圍的執行緒和系統中所有執行緒一起被排序和排程。

分離的執行緒時那些已經從它們的建立者中分離出來的執行緒。它們在終止或退出時,不需要同其他對等執行緒或主線程進行同步。它們仍共享所屬程序的位址空間,但是由於它們是分離的,建立它們的程序或執行緒不能對它們進行控制。當執行緒終止時,執行緒的id和狀態由系統儲存,預設情況下,一旦執行緒終止,該情況會通知給建立者,執行緒的id和狀態會返回給建立者。如果執行緒是分離的,則不會使用資源來儲存狀態或執行緒id。這些資源立即可以被系統重用。如果執行緒的建立者不需要在繼續處理之前等待執行緒終止,後者如果執行緒不要求在終止時同其他對等執行緒進行任何型別的非同步,那麼該執行緒可以成為乙個分離的執行緒。

執行緒從程序繼承排程策略。執行緒有優先順序,而且優先順序最高的執行緒會在較低優先順序的執行緒之前執行。通過對執行緒區分優先次序,系統中需要立即執行或響應的任務會被指定到處理器上並得到時間片。如果有著更高優先順序的執行緒可以執行,則正在執行的執行緒會被搶占。執行緒的優先順序可以被降低或提高。排程策略也決定了哪個執行緒會被指派到處理器上。可使用的策略有先進先出、輪詢等。通常,沒有必要在程序執行期間改變執行緒的排程屬性。如果程序環境發生變動,改變了時間約束,使得您需要改進程式的效能,則可能需要對排程進行改動。但是要考慮到改動應用程式中指定程序的排程屬性,可能會對應用程式的總體效能產生負面影響。

6.4 執行緒的結構

我們已經討論了程序以及執行緒同他所屬程序的關係。圖6-2顯示了包含多個執行緒的程序結構。程序通過上下文和屬性區別於系統中其他程序,執行緒也可以通過上下文和屬性區別於其他對等執行緒。程序有**段、資料段和棧段。執行緒同程序共享**段和棧段。程序的棧通常從記憶體的高位址開始,向下增長。執行緒棧以下乙個執行緒棧的開始位置為編輯。可以看到,執行緒棧包含其區域性變數。程序的全域性變數位於資料段中。threada和threadb的上下文包括執行緒id、狀態、優先順序、處理器暫存器等。程式計數器指向**段中函式task1() 和 task2()中下一條可執行指令。棧指標指向它們各自的棧的頂部。執行緒屬性物件同乙個執行緒或一組執行緒相關聯。在本例中,兩個執行緒使用相同的執行緒屬性。

6.4.1 執行緒狀態

執行緒是當前程序被排程執行時的執行單元。如果程序中只有乙個執行緒,該執行緒是只拍到處理器核心的主線程。如果程序有著多個執行緒,而且對於該程序有多個處理器可用,那麼所有的執行緒都會被指派到處理器上。

當執行緒被排程到處理器核心上執行時,它會改變自身的狀態。執行緒狀態是指在任意指定時間所處的模式或情形。執行緒有著同第5章程序接收的狀態和轉換相同的狀態和轉換。

有4種常見的狀態:

1)可執行

2)執行(活動)

3)停止

4)休眠(阻塞)

存在如下的轉換:

1)搶占

2) 接到訊號

3)分派

4)時間片用完

主線程可以決定整個程序的狀態。如果主線程時唯一的執行緒,則主線程的狀態同程序的狀態相同。如果主線程在休眠,程序也在休眠。如果主線程在執行,程序也在執行。對於有著多個執行緒的程序,只有程序中所有執行緒都處於休眠或停止狀態時,我們才能夠認為整個程序休眠或停止。另一方面,如果乙個執行緒是活動的(可執行或執行),那麼程序會被認為是活動的。

6.4.2 排程和執行緒競爭範圍

執行緒有著兩種競爭範圍:

1)程序競爭

2)系統競爭

有著程序競爭範圍的執行緒與相同程序的其他執行緒進行競爭。這些是混合執行緒(使用者級和核心級執行緒),系統將建立核心級執行緒池,使用者級執行緒將對映到它們。這些核心級執行緒是非繫結的,可以對映到乙個執行緒或多個執行緒。然後核心根據排程屬性將核心執行緒排程到處理器上。

圖6-3顯示了程序和系統兩種執行緒競爭範圍的區別。在有8個核心的多核環境中,有2個程序。程序a有4個執行緒,程序b有2個執行緒。程序a的4個執行緒中的3個執行緒競爭範圍是程序範圍,乙個執行緒的競爭範圍是系統範圍。程序b的兩個執行緒中,乙個執行緒競爭範圍是程序範圍,乙個執行緒的競爭範圍是系統範圍。程序a中有著程序範圍的執行緒競爭核心0和1,程序b中有著程序範圍的執行緒將使用核心2.程序a和b中系統範圍的執行緒競爭核心4和5.有著程序範圍的執行緒對映到執行緒池。程序a的執行緒池中有3個核心級執行緒,程序b的執行緒池中有兩個核心級執行緒。

競爭範圍可以對應用程式的效能產生潛在影響。程序排程模型潛在的為做出排程決策提供較低的開銷。因為只需要對乙個程序中的執行緒進行排程。

程序詳細剖析(二)

摘自 c 多核高階程式設計 5.6.3 程序狀態 在程序執行期間,它的狀態會發生改變。程序的狀態時指程序的當前狀況。在posix相容的環境中,程序可以處於以下狀態 1 執行 running 2 就緒 runnable,ready 3 僵死 zombied 4 等待 waiting,blocked 5...

執行緒池剖析

public final class threadpool 建立執行緒池,worker num為執行緒池中工作執行緒的個數 private threadpool int worker num 單態模式,獲得乙個預設執行緒個數的執行緒池 public static threadpool getthre...

資料型別詳細剖析

1.number 數字型別 nan not a num ber 但是它是數字型別的 isnan 檢測當前值是否不是有效數字,返回true 代表不是有效數字,返回false是有效數字 語法 isnan value var num 12 isnan num 檢測num變數儲存的值是否為有效數字 fals...