**自
首先理解概念
你吃飯吃到一半,**來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。
你吃飯吃到一半,**來了,你停了下來接了**,接完後繼續吃飯,這說明你支援併發。 (不一定是同時的)
你吃飯吃到一半,**來了,你一邊打**一邊吃飯,這說明你支援並行。
併發的關鍵是你有處理多個任務的能力,不一定要同時。
並行的關鍵是你有同時處理多個任務的能力。
所以我認為它們最關鍵的點就是:是否是『同時』。
1、併發和並行的區別
可由上圖形象指出兩者的區別:
1)定義:
併發:在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。
並行:在作業系統中,一組程式按獨立非同步的速度執行,無論從微觀還是巨集觀,程式都是一起執行的。
來個比喻:併發和並行的區別就是乙個人同時吃三個饅頭和三個人同時吃三個饅頭;
在單cpu系統中,系統排程在某一時刻只能讓乙個執行緒執行,雖然這種除錯機制有多種形式(大多數是時間片輪巡為主),但無論如何,要通過不斷切換需要執行的執行緒讓其執行的方式就叫併發(concurrent)。而在多cpu系統中,可以讓兩個以上的執行緒同時執行,這種可以同時讓兩個以上執行緒同時執行的方式叫做並行(parallel)。
2)併發通常指提高執行在單處理器上的程式的效能;
併發是有狀態的,「具有可論證的確定性,但是實際上具有不可確定性」;
"併發"在微觀上不是同時執行的,只是把時間分成若干段,使多個程序快速交替的執行,從巨集觀外來看,好像是這些程序都在執行。
使用多個執行緒可以幫助我們在單個處理系統中實現更高的吞吐量,如果乙個程式是單執行緒的,這個處理器在等待乙個同步i/o操作完成的時候,他仍然是空閒的。在多執行緒系統中,當乙個執行緒等待i/o的同時,其他的執行緒也可以執行。
二、非同步與多執行緒
1)基本概念
1. 併發:在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行。其中兩種併發關係分別是同步和互斥
2. 互斥:程序間相互排斥的使用臨界資源的現象,就叫互斥。
3. 同步:程序之間的關係不是相互排斥臨界資源的關係,而是相互依賴的關係。進一步的說明:就是前乙個程序的輸出作為後乙個程序的輸入,當第乙個程序沒有輸出時第二個程序必須等待。具有同步關係的一組併發程序相互傳送的資訊稱為訊息或事件。
其中併發又有偽併發和真併發,偽併發是指單核處理器的併發,真併發是指多核處理器的併發。
4. 並行:在單處理器中多道程式設計系統中,程序被交替執行,表現出一種併發的外部特種;在多處理器系統中,程序不僅可以交替執行,而且可以重疊執行。在多處理器上的程式才可實現並行處理。從而可知,並行是針對多處理器而言的。並行是同時發生的多個併發事件,具有併發的含義,但併發不一定並行,也亦是說併發事件之間不一定要同一時刻發生。
5. 多執行緒:多執行緒是程式設計的邏輯層概念,它是程序中併發執行的一段**。多執行緒可以實現執行緒間的切換執行。
6. 非同步:非同步和同步是相對的,同步就是順序執行,執行完乙個再執行下乙個,需要等待、協調執行。非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成後再工作。執行緒就是實現非同步的乙個方式。非同步是讓呼叫方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程幹其它的事情。
非同步和多執行緒並不是乙個同等關係,非同步是最終目的,多執行緒只是我們實現非同步的一種手段。非同步是當乙個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回而可以做其它的事情。實現非同步可以採用多執行緒技術或則交給另外的程序來處理。
非同步和同步的區別, 在io等待的時候,同步不會切走,浪費了時間。
多執行緒的好處,比較容易的實現了 非同步切換的思想, 因為非同步的程式很難寫的。多執行緒本身程還是以同步完成,但是應該說比效率是比不上非同步的。 而且多線很容易寫, 相對效率也高。
2)深層次理解
多執行緒和非同步操作的異同
多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。
非同步操作的本質
所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對dma這個詞不陌生,硬碟、光碟機的技術規格中都有明確dma的模式指標,其實網絡卡、音效卡、顯示卡也是有dma功能的。dma就是直接記憶體訪問的意思,也就是說,擁有dma功能的硬體在和記憶體進行資料交換的時候可以不消耗cpu資源。只要cpu在發起資料傳輸時傳送乙個指令,硬體就開始自己和記憶體交換資料,在傳輸完成之後硬體會觸發乙個中斷來通知操作完成。這些無須消耗cpu時間的i/o操作正是非同步操作的硬體基礎。所以即使在dos這樣的單程序(而且無線程概念)系統中也同樣可以發起非同步的dma操作。
執行緒的本質
執行緒不是乙個計算機硬體的功能,而是
作業系統提供的一種邏輯功能,執行緒本質上是程序中一段併發執行的**,所以執行緒需要作業系統投入cpu資源來執行和排程。
非同步操作的優缺點
因為非同步操作無須額外的執行緒負擔,並且使用**的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用**方式進行處理,與普通人的思維方式有些初入,而且難以除錯。
多執行緒的優缺點
多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來
上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。
適用範圍
在了解了執行緒與非同步操作各自的優缺點之後,我們可以來**一下執行緒和非同步的合理用途。我認為:當需要執行i/o操作時,使用非同步操作比使用執行緒+同步i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting等跨程序的呼叫。
而執行緒的適用範圍則是那種需要長時間cpu運算的場合,例如耗時較長的圖形處理和演算法執行。但是往往由於使用執行緒程式設計的簡單和符合習慣,所以很多朋友往往會使用執行緒來執行耗時較長的i/o操作。這樣在只有少數幾個併發操作的時候還無傷大雅,如果需要處理大量的併發操作時就不合適了。
小禮物走一走
併發 並行 同步 非同步 多執行緒的區別
多執行緒和非同步操作的異同 多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。非同步操作的本質 所有的程式最終都...
併發 並行 同步 非同步
併發 任務數量大於核心數,兩個或多個時間在同一時間間隔發生 並行 任務數量小於或等於核心數,兩個或多個時間在同一時間發生 你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。不一定是同時的 你吃飯吃...
python 同步非同步,併發並行,同步鎖
併發 系統具有處理多個任務 動作 的能力 並行 系統具有同時處理多個任務 動作 的能力 同步 當程序執行到乙個io 等待外部資料 的時候,需要等待,等待即同步 非同步 當程序執行到乙個io 等待外部資料 的時候,不需要等待,待資料接收成功後,再回來處理。gil 全域性解釋鎖 無論你有多少個執行緒,你...