計算機早期,作業系統都沒有執行緒的概念,整個系統只運行著一個執行執行緒,同時包含作業系統代碼和應用程式代碼,所以就存在一個問題,長時間運行的任務會阻止其他任務執行,例如:在16位Windows的那些日子,列印檔案會“凍結“整臺機器,
隨后微軟為了解決這部分問題,引入行程概念,但是CPU本身呢,應用程式發生死回圈呢?所以執行緒應運而生,它是對CPU的虛擬化,為每個行程提供行程專用的執行緒,
總體概覽
開銷
- 執行緒內核物件 (thread kernel object),包含執行緒背景關系,背景關系中保存CPU暫存器集合的記憶體塊,在x64位系統中占1240位元組
- 執行緒環境塊 (thread environment block TEB),耗用一個記憶體頁4KB,
- 用戶模式堆疊 (user-mode stack),系統保留1MB的地址空間,
- 內核模式堆疊 (kernel-mode stack),針對從用戶模式的代碼傳遞給內核的任何實參,x64 占用 24KB,
- DLL 執行緒連接(attach)和 執行緒分離(detach)通知,
執行緒背景關系切換
- 將CPU暫存器的值保存在當前正在運行的執行緒內核物件內部的一個背景關系結構中,
- 從現有執行緒集合中選出一個執行緒供調度,如果該執行緒由另一個執行緒擁有,系統在開始執行任何代碼或者接觸任何資料之前,還必須切換CPU看見的虛擬地址空間,
- 將所選背景關系結構中的值加載到CPU的暫存器中,
背景關系切換大約耗時 30ms,一個時間片結束后,如果系統決定再次呼叫同一個執行緒,系統不會執行背景關系切換,所以,你懂的,要盡量避免切換,4核最理想是4個執行緒同步執行,初衷,微軟在設計OS的時候,決定側重于可靠性與相應能力,而非側重于速度和性能,
使用執行緒理由
- 可回應性
- 性能
- 計算限制的異步操作
- I/O限制的異步操作
執行緒調度和優先級
Windows 又被稱之為搶占式多執行緒(preemptive multi-threaded)作業系統,是因為執行緒可在任何時間停止被搶占并調度另一個執行緒,執行緒分0到31的優先級,其中0為零頁執行緒,在沒有其他執行緒作業的時候,零頁執行緒將系統記憶體中的所有空閑頁清零,一般執行緒優先級為Normal,如圖與執行緒存在Normal行程中的Normal執行緒,也就是8,
| 相對執行緒優先級 | 行程優先級類 Idle | Below Normal | Normal | Above Normal | High | Realtime |
|---|---|---|---|---|---|---|
| Time-Critical | 15 | 15 | 15 | 15 | 15 | 31 |
| Highest | 6 | 8 | 10 | 12 | 15 | 26 |
| Above Normal | 5 | 7 | 9 | 11 | 14 | 25 |
| Normal | 4 | 6 | 10 | 13 | 24 | |
| Below Normal | 3 | 5 | 7 | 9 | 12 | 23 |
| Lowest | 2 | 4 | 6 | 8 | 11 | 22 |
| Idle | 1 | 1 | 1 | 1 | 1 | 16 |
前臺執行緒和后臺執行緒
CLR將每個執行緒要么視為前臺執行緒,要么視為后臺執行緒,一個行程所有前臺執行緒停止運行時,CLR強制終止仍然在運行的后臺執行緒,并不拋出例外,關鍵字:Background,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/108742.html
標籤:C#
上一篇:asp.net MVC通用權限管理系統-回應式布局-原始碼
下一篇:C# Moq
