多執行緒系列(一):認識執行緒

K戰神發表於2014-09-11

一、什麼是執行緒

   執行緒是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。所以執行緒基本上是輕量級的程式,它負責在單個程 序裡執行多工。通常由作業系統負責多個執行緒的排程和執行。

二、執行緒的開銷

執行緒產生空間(記憶體消耗)和時間(執行時的執行效能)上的消耗。

(1)執行緒核心物件

   包含一組描述執行緒的屬性、執行緒上下文。

(2)執行緒環境塊(thread environment block)

 在使用者模式下分配初始化的一個記憶體塊。它包含執行緒異常處理鏈首。執行緒進入try塊時,就會在這個鏈首插入節點,退出時刪除節點。

(3)使用者模式棧

 儲存傳給方法的區域性變數和實參。還包含一個當前方法返回時,應該從什麼地方開始執行緒的地址。使用者模式棧預設分配1M.

(4)核心模式棧

  程式向作業系統核心模式的函式床底實參,會使用核心模式棧。從使用者模式程式碼床給核心的任何實參,都會從執行緒的使用者模式棧複製到執行緒的核心模式棧。

(5)dll執行緒連線和分離通知

  程式建立一個執行緒,都會載入程式的所有dll,同時傳遞一個連線通知。反之,也回撥用所有的dll,並傳遞一個分離通知。

(6)上下文切換

  在任何時刻,系統只將一個執行緒分配給一個cpu,並可以執行一個時間片,時間片到期,就會發生上下文切換,切換到另一個執行緒。

    A、對於即將結束執行的的執行緒,它存在cpu暫存器中的值儲存到此執行緒核心物件的上下文結構中。

    B、選擇要切換載入的新執行緒,並將此執行緒的上下文載入到cpu暫存器。

    C、cpu執行所選的新執行緒,執行一個時間片,如上再次切換。。。

  注意:

    這樣的話,如果一個程式無限迴圈,系統會定期搶佔。

    如果要切換到同樣的執行緒,就不會切換上下文。

    執行垃圾回收,CLR必須暫停所有的執行緒,遍歷棧,查詢根,對隊中的物件進行標記。恢復所有執行緒。

 

相關文章