併發 多執行緒 非同步 並行

2022-03-11 10:32:03 字數 3338 閱讀 6699

一 基本概念:

併發:同時處理多件事情,在處理第乙個請求時同時響應第二個請求;

同步:同步就是順序執行,執行完乙個再執行下乙個,需要等待、協調執行,同步 呼叫在繼續之前等待響應或返回值。如果不允許呼叫繼續,就說呼叫被阻塞 了

非同步:併發的一種形式,(1)它採用**機制,避免產生不必要的執行緒。(2)多執行緒也可以成為實現程式非同步的一種方式,在這裡 非同步和多執行緒並不是乙個同等關係,非同步是最終目的,多執行緒只是我們實現非同步的一種手段(這違反了非同步操作的本質)

多執行緒:併發的另一種形式,它採用多個執行緒來執行程式。對多個執行緒的管理使用了執行緒池。

並行處理:把正在執行的大量任務,分割成小塊分配個多個執行的執行緒,執行緒池是存放任務的佇列,這個佇列能根據需要自行調整。由此產生了並行處理這個概念,多執行緒的一種,而多執行緒是併發的一種

二 多執行緒和非同步對比:

多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性

執行緒的本質:

執行緒不是乙個計算機硬體的功能,而是作業系統提供的一種邏輯功能,執行緒本質上是程序中一段併發執行的**,所以執行緒需要作業系統投入cpu資源來執行和排程

非同步操作的本質:

所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對dma這個詞不陌生,硬碟、光碟機的技術規格中都有明確dma的模式指標,其實網絡卡、音效卡、顯示卡也是有dma功能的。dma就是直 接記憶體訪問的意思,也就是說,擁有dma功能的硬體在和記憶體進行資料交換的時候可以不消耗cpu資源。只要cpu在發起資料傳輸時傳送乙個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發乙個中斷來通知操作完成。這些無須消耗cpu時間的i/o操作正是非同步操作的硬體基礎。所以即使在dos 這樣的單程序(而且無線程概念)系統中也同樣可以發起非同步的dma操作。

非同步優缺點:

因為非同步操作無須額外的執行緒負擔,並且使用**的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用**方式進行處理,與普通人的思維方式有些出入,而且難以除錯。

多執行緒優缺點:

多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現

兩者適用範圍:

在了解了執行緒與非同步操作各自的優缺點之後,我們可以來**一下執行緒和非同步的合理用途。我認為:當需要執行i/o操作時,使用非同步操作比使用執行緒+同步 i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting等跨程序的呼叫。

而執行緒的適用範圍則是那種需要長時間cpu運算的場合,例如耗時較長的圖形處理和演算法執行。但是往往由於使用執行緒程式設計的簡單和符合習慣,所以很多朋友往往會使用執行緒來執行耗時較長的i/o操作。這樣在只有少數幾個併發操作的時候還無傷大雅,如果需要處理大量的併發操作時就不合適了。

實現非同步的四種方式:

三 tpl:

* tpl=>task parallel library 並行庫,它是基於執行緒池的

* 一種框架要使得並行執行不會產生太多的程序,能夠保證工作量能夠平均的分配到所有執行緒上,並且能夠報告錯誤和產生可靠地結果,這就是並行庫task parallel library的工作

* (1)到底建立多少個執行緒才合適

* (2)執行緒如何同步訪問結果集,例如多個執行緒同時訪問list,是非執行緒安全的,每一次對執行緒加鎖代價又很高,會帶來嚴重的效能瓶頸

* (3)如何保證每個執行緒工作量的合理分配(盡可能的平分)

* (4)如果某個執行緒中丟擲了異常,我們怎麼處理呢

* (5)對於小的計算問題,建立那麼多的執行緒是否值得。或者說,對於這種情況,在單一執行緒中同步執行這些計算操作是否更恰當,建立和銷毀乙個執行緒開銷是很大的

* (6)怎樣保證我們不會壟斷系統資源或者給計算機帶來過大負擔

* 從手動的執行緒管理來看,最自然的就是執行緒池了。執行緒池能管理很多個執行緒。和手動建立乙個執行緒來執行特定操作不同,我們將工作任務扔到執行緒池中,它會選擇合適的執行緒,然後去執行我們給定的方法。

* 執行緒池解決了上面列出的若干問題,執行緒池通過限制建立執行緒的總數,根據給定的工作量來決定建立合適的執行緒數量,降低了在極端情況下,如處理量比較少的情況下建立和銷毀執行緒的開銷,幫助我們解決了對系統資源的獨佔和過度使用。

* * 任務並行化:

* 任務並行化是指通過一系列api將大的任務分解成一系列小的任務,然後再多執行緒上並行執行

* (tpl)並行庫有一系列api能夠基於執行緒池同時管理成千上萬個任務。tpl的核心是system.threading.tasks類,他代表乙個小的任務,「task是一種對執行緒和執行緒池裡面的工作項的一種結構話抽象,task類提供了如下這些功能

* (1)能夠排程任務在非指定的執行緒上獨立執行,要在特定的執行緒上執行給定任務需要通過task scheduler來確定,預設的task scheduler會將任務放到clr的執行緒池中,但是有一些task scheduler可以將任務傳送到特定的執行緒,如ui執行緒上。

(2)能夠等待任務結束,並獲取執行的結果

(3)能夠提供一種機制,等待某一任務執行結束後立即執行繼續的操作,通常我們稱之為**,但是在這裡我們使用繼續這一術語。

(4)能夠處理單一任務丟擲的異常,甚至是有層次關係的任務在原始的執行緒上,或者是任何乙個對任務結果會產生影響的異常。

(5)在任務還沒有開始的時候,可以取消任務,或者是在任務執行過程中,提交結束任務請求。

* 控制並行化:

* 注意:當處理的資料量比較少時,使用並行會將大部分的花費都耗在了建立task物件,將帶物件放到執行緒池以及等待任務完成上,這些操作浪費的時間遠遠大於資料處理的時間;

* 可能會出現並行執行比同步還要耗費更多時間的情況,所以要控制並行化.tpl預設啟動5個執行緒,任務數小於5的話,啟動任務數個執行緒。如果任務較多,tpl在初始化5個執行緒後,每隔100毫秒左右新增執行緒,直到達到最大執行緒數。如果新增執行緒的過程中有任務完成,那麼就不會新增執行緒

* 問題:執行緒數無法控制,容易造成高cpu,系統失去響應

* (1)只要陣列的大小大於某乙個閾值,就採用並行版本,否則採用順序執行的版本。

(2)只要遞迴的深度小於某一閾值,採用並行版本,否則採用順序執行版本。(這一點甚至要優先於第一條,除非哨兵元素一直恰好排在元素的中間。

(3)只要需要執行的任務個數小於特定的閾值,採用並行版本,否則採用順序執行版本(這一條在沒有其他的限制並行化的原則下比如遞迴的深度以及輸入的大小上

四  非同步程式設計:

併發並行同步非同步多執行緒

自 首先理解概念 你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。不一定是同時的 你吃飯吃到一半,來了,你一邊打 一邊吃飯,這說明你支援並行。併發的關鍵是你有處理多個任務的能力,不一定要同時。並...

高併發 並行,多執行緒 同步非同步,鎖

1 為什麼需要並行?業務要求 業務需要邏輯執行單元,想到用執行緒充當這個單元 效能並行 比序列 複雜的多。2 幾個重要的概念 同步 synchronous 和非同步 asynchronous 相對於方法呼叫而言。同步等待方法返回。非同步呼叫瞬間返回,呼叫不一定完成,在後台另起乙個執行緒慢慢的去做它的...

併發和並行,非同步與多執行緒區別

1 併發和並行的區別 可由上圖形象指出兩者的區別 1 定義 併發 在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。並行 在作業系統中,一組程式按獨立非同步的速度執行,無論從微觀還是巨集觀,程式都...