程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 線程也瘋狂------線程基礎,------線程基礎

線程也瘋狂------線程基礎,------線程基礎

編輯:C#入門知識

線程也瘋狂------線程基礎,------線程基礎


參考頁面:

http://www.yuanjiaocheng.net/webapi/create-crud-api-1.html

http://www.yuanjiaocheng.net/webapi/create-crud-api-1-get.html

http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html

http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html

http://www.yuanjiaocheng.net/webapi/create-crud-api-1-delete.html

前言

最近在做一個公司內部的分享,主要是關於線程處理方面,課程的目標是培訓那些對線程理解和使用有所欠缺的開發人員,本篇文章主要介紹為什麼引入線程的概念、CPU的發展趨勢、線程開銷、線程調度。

 

Windows為什麼要支持線程

早期的操作系統是沒有線程概念的,整個系統只運行一個執行線程,其中包含了系統代碼和程序代碼。只用一個執行線程的問題在於,長時間的運行任務會阻止其他任務執行,有些應用程序的bug會造成死循環,同樣會造成整個機器停止工作,針對這個問題用戶只好重啟計算機。在這種迫切的需求下,微軟計劃構建一個新的OS來滿足企業和個人的需要,新的OS必須健壯、可靠、易於伸縮和安全。

 

進程和線程的概念

進程實際是應用程序的實例要使用的資源的集合,每個進程都被賦予了一個虛擬的地址空間,確保在一個進程中使用的代碼和數據無法由另一個進程訪問。這樣就確保了程序的健壯性,此外進程也無法訪問OS的系統代碼,使得操作系統更加穩定和安全。

但是對於CPU呢? 應用程序會死循環執行嗎?如果安裝上面所說,機器只有一個cpu,它會執行死循環,不能執行其他任何東西,雖然數據無法被破壞,而且更加安全但是系統仍然可能停止響應,微軟針對這種問題,解決的方案就是線程。

線程職責:對CPU進行虛擬化,Windows為每個進程都提供了該進程專用的線程,如果應用程序的代碼進入死循環,與那個代碼關聯的進程會凍結,但其他進程仍會繼續執行。

 

線程開銷

同一切虛擬化機制一樣,線程有空間(內存)和時間(性能)上的開銷:

1. 線程內核對象

通俗的講就是線程的數據結構,主要包括:線程描述、線程上下文(CPU寄存器集合的內存塊),不同的架構對應的線程上下文使用的字節也不同

 

2. 線程環境塊(TEB)

TEB是在用戶模式中分配和初始化的內存塊,大約1個內存頁4kb,主要包括:線程異常處理鏈首、線程本地存儲數據以及由GDI和OpenGL圖形使用的一些數據結構

 

3. 用戶模式棧

存儲傳給方法的局部變量和實參。

 

4. 內核模式棧

驗證用戶模式棧中的參數的值。

 

5. DLL線程連接和線程分離通知

調用所有於線程有關操作(創建、終止等)的非托管DLL的DLLMain方法,並向方法傳遞ATTACH標志。

 

線程上下文

Windows任何時刻只將一個線程分配給CPU,每個線程只能運行一個時間片的長度,時間片到期,Windows就上下文切換到一另外一個線程,每次切換線程的操作:

1. 將CPU寄存器的值保存到當前正在運行的線程的內核對象內部的一個上下文結構

2. 從現有線程集合中選出一個線程提供調度

3. 將所選上下文結構中的值加載到CPU的寄存器中

上下文切換完成後,CPU執行所選的線程,直到它的時間片到期。上下文的切換對性能的影響非常大,而且切換所需的時間取決於CPU架構和速度,填充CPU緩存所需要的時間取決於操作系統中運行的程序、CPU緩存的大小以及其他各種因素,所以無法為每一次上下文的開銷給出確定的值,所以要構建搞性能的應用程序和組件,盡量避免上下文切換。

 

線程調度和優先級

Windows之所以被成為搶占式多線程操作系統,是因為線程可在任何時間停止並調度另一個線程,每個線程都分配了從0到31的優先級,系統決定為CPU分配哪個線程時,首先檢查優先級為31的線程,並通過輪流方式調度它們,如果優先級31的一個線程可以調度,就把它分配給CPU。在這個線程的時間片結束時,系統檢查是否有另一個優先級31的線程可以運行。

只要存在可調度的優先級31的線程,系統就永遠不會將<31的任何線程分配給CPU,這種情況稱之為饑餓。

進程優先級類:Idle,Below Normal,Normal,Above Normal,High,Realtime. 默認為Normal

 

前台線程和後台線程

一個進程的所有前台線程停止運行時,CLR強制終止仍在運行的任何後台線程。

 

本篇主要是講解線程的基礎知識理論過多可能會枯燥,總的來說線程是非常寶貴的資源,必須省著使用,為了做到這一點,最好的方式就是使用CLR的線程池,線程池為你自動管理線程的創建和銷毀。下篇會繼續講解,計算限制的異步操作,結合實際案例了解異步操作的優點。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved