由clr via c#(第三版) ,摘抄記錄...
1、執行緒是cpu的虛擬化,windows為每個程序提供專用線程(cpu)
2、執行緒開銷:記憶體和時間。
執行緒核心物件—os為系統中建立的每個執行緒都分配並初始化這種資料結構之一。其中包含對執行緒進行描述的屬性,和上下文。上下文是記憶體塊,x86的是約700位元組,x64是約1240,ia64是2500。
執行緒環境塊teb,使用者模式中的記憶體塊(應用程式**能快速訪問的空間),乙個teb乙個記憶體頁,x86和x64都是4kb,ia64是8kb。 teb包含執行緒的異常處理鏈首(head)。進入每乙個try都在後面插入乙個節點,退出try時刪除該節點。 teb還包含執行緒的本地儲存 資料,以及gdi和opengl圖形使用的資料。
使用者模式棧 儲存傳遞給方法的區域性變數和實參,還包含乙個位址,指出方法返回時,執行緒從何處執行。預設1mb。
核心模式棧 32位windows下為12kb,64的是24kb。
dll執行緒連線和執行緒分離通知 windows策略決定。。c#和其他託管語言的dll沒有dllmain函式,不收通知,這提公升效能。
3、windows只將乙個執行緒分配給乙個cpu,允許其執行乙個 時間片 ,上下文切換。
切換:將cpu暫存器的值儲存核心物件內部的上下文結構中,選出乙個新執行緒供排程,將其內的上下文結構值載入到cpu。
大約每30毫秒執行一次切換。淨開銷。而且還會切換快取記憶體cache。盡可能避免切換。
時間片結束時,如果windows決定再排程同一執行緒,就沒有切換。這顯著改進效能。
4、垃圾**時,clr暫停所有執行緒,遍歷他們的棧進行標記,再遍歷棧,再恢復所有執行緒。所以,減少執行緒數量會顯著提公升垃圾**器的效能。除錯時也掛起,執行緒越多,除錯體驗越差。
單個執行緒不會在多個核心cpu上排程,應在確保響應能力的同時建立盡量少的執行緒。理性使用執行緒。
5、超執行緒cpu,晶元中包含2組架構狀態,只有一組在執行,對於windows,看起來像是2個cpu,所有windows會同時排程2個執行緒。晶元一次只能執行乙個。
6、numa架構機器,(略)
7、clr執行緒和windows執行緒: clr使用的是windows的執行緒處理能力。乙個clr執行緒直接對應乙個windows執行緒。
8、使用專用線程執行非同步的計算限制操作。
建議避免採用,應盡量使用clr的執行緒池來執行非同步計算限制操作。
顯示建立自己執行緒的條件:
優先順序高,不建議更改執行緒池的優先順序;
乙個計算限制的任務需要長時間執行。
要呼叫abort方法提前終止它。
thread.join()等待執行緒終結。
9、使用執行緒的理由 **隔離健壯性,簡化編碼,併發。
觀點改變,cpu計算能力富餘,應大膽消費。
10、執行緒排程和優先順序
搶占式作業系統,使用演算法判斷在什麼時間排程哪些執行緒多少時間。
乙個時間片後,windows檢查現有所有執行緒核心物件,有資源的適合排程。從spy++可以檢視切換的次數。執行緒在任何時間可以被搶占,windows排程另乙個。你不能阻止其他執行緒的執行。
所以,windows是搶占式作業系統,不是實時作業系統,clr使託管**的行為更不實時。比如:dll的jit載入,**的jit編譯,gc無法**的介入。
執行緒優先順序從0(最低)-31(最高),系統啟動時有個為0的零頁執行緒的特殊執行緒,唯一乙個0的執行緒,在沒有其他程序要排程時,將系統ram所有空閒頁清零。
優先順序類(priority class) :idle,below normal,normal,above normal,high和realtime。 優先順序類是用於程序的。每個執行緒的優先順序取決於 他所屬的程序的優先順序類和在該程序內他自身的優先順序——倆者合成基礎優先順序——動態優先順序是os確保執行緒可響應,不一直飢餓所產生。但是16-31之間的執行緒,系統不提公升他們的優先順序。0-15的才提公升。
應用開發人員永遠不直接處理優先順序。normal的normal是8,大多數程式都是8的優先順序。windwos永遠不會排程程序,只排程執行緒。程序根據啟動它的程序來分配乙個優先順序。大多數程序都是windows資源管理器啟動的,屬於normal。
11、 前台執行緒和後台執行緒
執行緒在clr中要麼是前台,要麼是後台。乙個程序中的所有前台停止時,clr強制終止扔在執行的任何後台執行緒。--直接終止,不丟擲異常。
1後台執行緒public
static
void
main()216
private
static
void
worker()
1724 }
wintellect類庫,作者寫的....
~~~~~~~~~~待續~~
複製去google翻譯
重溫CLR(一)CLR基礎
如果乙個c developer,對clr沒有了解,那就只能是入門級別。未來.net core是趨勢,但是.net core 也是基於coreclr的,而clr和coreclr其實差別不大,從runtime那部分看幾乎沒有區別,程序管理,gc,jit這些基本上是一樣的。clr vie c 這本書很久之...
CLR 程序與執行緒
程序不過是應用程式的乙個例項要使用的資源的乙個集合,每個執行緒都被作業系統賦予了乙個虛擬位址空間,確保乙個程序中使用的 和資料無法被另乙個執行緒訪問.windows中,任何時候呼叫程序中建立的執行緒,都會呼叫哪個程序中載入的所有dll的,終止某個執行緒時,也要呼叫載入的所有dll 在clr執行垃圾 ...
CLR執行緒優先順序
clr為每個執行緒分配了從0 最低 31 最高 的乙個優先順序。clr執行緒的優先順序取決於兩個標準 程序優先順序 相對執行緒優先順序和優先順序的對映關係 idle below normal normal above normal high realtime time critical 1515 1...