CLR via C#:線程基礎

基礎知識:如下所示:
1.不同的應用程序會分配成不同的進程(一個虛擬地址空間)。一個進程中使用的代碼和數據無法被另一個進程訪問,從而確保應用程序的健壯性(可靠性)。
2.一個進程中可以分配多個線程,且不同進程的線程之間互相獨立。當一個進程中的線程被凍結時,其他進程的線程可以正常執行,從而確保應用程序的響應能力。
3.線程的數量不超過CPU數目時,線程可以全速運行;否則就會出現上下文切換和性能損失。

線程內存開銷:如下所示:
1.線程內核對象:OS創建線程時都會分配並初始化的內存塊。具有以下部分:
1>.一組對線程進行描述的屬性。
2>.線程上下文。x86架構佔用700KB;x64架構佔用1240KB;arm架構佔用350KB。
2.線程環境塊:是在用戶模式(應用程序代碼能快速訪問的地址空間)中分配並初始化的內存塊。具有以下部分:
1>.包含一個4KB的內存頁。
2>.包含線程的異常處理鏈首。線程進入try塊都會在鏈首插入一個節點;線程退出try塊時都會從鏈首刪除該節點。
3>.線程本地存儲以及GDI和OpenGL數據結構。
3.用戶模式棧:一個1MB的內存塊。具有以下部分:
1>.存儲傳給函數的局部變量和實參。
2>.包含一個地址。指出當前函數返回時,線程應該從什麼地方接着執行。
4.內核模式棧:一個12KB(32位OS)或者24KB(64位OS)的內存塊。具有以下特性:
1>.針對從用戶模式的代碼傳給內核的任何實參,OS都會從線程的用戶模式棧複製到線程的內核模式棧。
2>.內核會調用它自己內部的函數,並利用內核模式棧傳遞它自己的實參,存儲函數的局部變量以及存儲返回地址。

線程時間開銷:如下所示:
1.DLL線程連接和線程分離通知:創建線程時,所有非託管DLL的DllMain函數會收到DLL
_THREAD_ATTACH通知;終止線程時,所有非託管DLL的DllMain函數會收到DLL
_THREAD_DETACH通知。
2.上下文切換:是一種淨開銷操作,但是可以給用戶提供一個健康且響應靈敏的OS。流程如下所示:
1>.將CPU寄存器的值保存到當前正在運行的線程的內核對象內部的一個上下文結構中。
2>.從現有線程集合中選出一個線程供調度。
3>.將所選上下文結構中的值加載到CPU的寄存器中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章