非同步編程

非同步編程

.NET 與C# 每個版本發布都是有一個“主題”。即:C#1.0託管代碼→C#2.0泛型→C#3.0LINQ→C#4.0動態語言→C#5.0非同步編程。

線程概述


多核心CPU超線程CPU
1. 多核心處理器(CPU)指在一塊處理器(CPU)中含有多個處理單元,每一個處理單元它就相當於一個單核處理器(CPU)。因此,多核處理器的功能就相當於多台單核處理器電腦聯機作戰。
2.超線程處理器(CPU)指在一塊CPU中,用虛擬的方法將一個物理核心模擬成多個核心(一般情況是一個單物理核心,模擬成二個核心,也即所謂的二線程。只有當線程數比物理核心數多才能叫超線程。如四核四線程並不是超線程,而四核八線程才能叫超線程)。
3.優缺點:
1)多核心是真正的物理核心,一塊多核心的處理器(CPU),就相當於多塊單核心的處理器(CPU)相互協作。因此,從理論上說,多核心比超線程具有更高運算能力。雖然多核心比超線程的運算速度快很多,但多核心也有一個明顯的缺點,那就是多核心的使用效率比超線程處理器(CPU)低。因為,多核心在處理數據時,它們相互“合作”的並不是很完美,常常某個核心需要等待其他核心的計算數據,從而耽誤時間,被迫怠工。另外,由於目前多核心都是採用共享三級緩存,這更使多核心的CPU運算速度減慢不少。
2)超線程是用虛擬的方法將一個物理核心虛擬成多個核心,它能夠最大限度地利用現有的核心資源,具有較高性價比。

操作系統對多核處理器的優化

主要體現在調度和中斷上:
1.對任務的分配進行優化。使同一應用程序的任務盡量在同一個核上執行。
2.對任務的共享數據優化。由於多核處理器(Chip Multi-Processor,CMP)體系結構共享二級緩存(目前),可以考慮改變任務在內存中的數據分佈,使任務在執行時盡量增加二級緩存的命中率
3.對任務的負載均衡優化。當任務在調度時,出現了負載不均衡,考慮將較忙處理器中與其他任務最不相關的任務遷移,以達到數據的衝突最小。

進程和線程

1. 進程 進程是應用程序的執行實例,每個進程是由私有的虛擬地址空間、代碼、數據和其它各種系統資源組成,進程在運行過程中創建的資源隨著進程的終止而被銷毀,所使用的系統資源在進程終止時被釋放或關閉。
2. 線程 線程是進程內部的一個執行單元。系統創建好進程后,實際上就啟動執行了該進程的主執行線程。主執行線程終止了,進程也就隨之終止。
每個線程都維護異常處理程序、調度優先順序和線程上下文。(線程上下文,當前執行的線程在其時間片結束時被掛起,而另一個線程繼續運行。當系統從一個線程切換到另一個線程時,它將保存被搶先的線程的線程上下文,並重新載入線程隊列中下一個線程的已保存線程上下文)
3. 關係 操作系統使用進程將它們正在執行的不同應用程序分開,.NET Framework 將操作系統進程進一步細分為System.AppDomain (應用程序域)的輕量託管子進程。
線程是CPU的調度單元,是進程中的執行單位,一個進程中可以有多個線程同時執行代碼。

使用


當一個非同步過程調用發出后,調用者不能立刻得到結果。基於事件機制,實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。比如,你現在要有一批數據要大數據要入庫,你又不想一邊入庫一邊等待返回結果,你可以用非同步,將大數據推入一個隊列,然後另外一個線程來操作這個隊列裡面的數據入庫,入完了,就通知一下主線程。這段時間你的主線程可以做任何事。