首先這裏說的同步和異步是指函數/方法調用方面。 java
很明顯,同步調用會等待方法的返回,異步調用會瞬間返回,可是異步調用瞬間返回並不表明你的任務就完成了,他會在後臺起個線程繼續進行任務。 設計模式
併發和並行在外在表象來講,是差很少的。由圖所示,並行則是兩個任務同時進行,而併發呢,則是一會作一個任務一會又切換作另外一個任務。因此單個cpu是不能作並行的,只能是併發。 安全
臨界區用來表示一種公共資源或者說是共享數據,能夠被多個線程使用,可是每一次,只能有一個線程使用它,一旦臨界區資源被佔用,其餘線程要想使用這個資源,就必須等待。 多線程
因此阻塞的方式,通常性能不會太好。根據通常的統計,若是一個線程在操做系統層面被掛起,作了上下文切換了,一般狀況須要8W個時間週期來作這個事情。 併發
所謂死鎖:是指兩個或兩個以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象,若無外力做用,它們都將沒法推動下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。就如同下圖中的車都想前進,卻誰都沒法前進。 異步
可是死鎖雖然說是很差的現象,可是它是一個靜態的問題,一旦發生死鎖,進程被卡死,cpu佔有率也是0,它不會佔用cpu,它會被調出去。相對來講仍是比較好發現和分析的。 函數
與死鎖相對應的是活鎖。 高併發
活鎖,指事物1可使用資源,但它讓其餘事物先使用資源;事物2可使用資源,但它也讓其餘事物先使用資源,因而二者一直謙讓,都沒法使用資源。 性能
舉個例子,就如同你在街上遇到我的,恰好他朝着你的反方向走,與你正面碰到,大家都想讓彼此過去。你往左邊移,他也往左邊移,兩人仍是沒法過去。這時你往右邊移,他也往右邊移,如此循環下去。 優化
一個線程在取得了一個資源時,發現其餘線程也想到這個資源,由於沒有獲得全部的資源,爲了不死鎖把本身持有的資源都放棄掉。若是另一個線程也作了一樣的事情,他們須要相同的資源,好比A持有a資源,B持有b資源,放棄了資源之後,A又得到了b資源,B又得到了a資源,如此反覆,則發生了活鎖。
活鎖會比死鎖更難發現,由於活鎖是一個動態的過程。
飢餓是指某一個或者多個線程由於種種緣由沒法得到所須要的資源,致使一直沒法執行。
併發級別:阻塞和非阻塞(非阻塞分爲無障礙、無鎖、無等待)
當一個線程進入臨界區後,其餘線程必須等待
和非阻塞調度相比呢,阻塞調度是一種悲觀的策略,它會認爲說一塊兒修改數據是頗有可能把數據改壞的。而非阻塞調度呢,是一種樂觀的策略,它認爲你們修改數據未必把數據改壞。可是它是一種寬進嚴出的策略,當它發現一個進程在臨界區內發生了數據競爭,產生了衝突,那麼無障礙的調度方式則會回滾這條數據。
在這個無障礙的調度方式當中,全部的線程都至關於在拿去一個系統當前的一個快照。他們一直會嘗試拿去的快照是有效的爲止。
與無障礙相比,無障礙並不保證有競爭時必定能完成操做,由於若是它發現每次操做都會產生衝突,那它則會不停地嘗試。若是臨界區內的線程互相干擾,則會致使全部的線程會卡死在臨界區,那麼系統性能則會有很大的影響。
而無鎖增長了一個新的條件,保證每次競爭有一個線程能夠勝出,則解決了無障礙的問題。至少保證了全部線程都順利執行下去。
下面代碼是Java中典型的無鎖計算代碼
無鎖在Java中很常見
while (!atomicVar.compareAndSet(localVar, localVar+1)) { localVar = atomicVar.get(); }
首先無等待的前提是無鎖的基礎上的,無鎖它只保證了臨界區確定有進也有出,可是若是進的優先級都很高,那麼臨界區內的某些優先級低的線程可能發生飢餓,一直出不了臨界區。那麼無等待解決了這個問題,它保證全部的線程都必須在有限步內完成,天然是無飢餓的。
無等待是並行的最高級別,它能使這個系統達到最優狀態。
無等待的典型案例:
若是隻有讀線程,沒有線線程,那麼這個則必然是無等待的。
若是既有讀線程又有寫線程,而每一個寫線程以前,都把數據拷貝一份副本,而後修改這個副本,而不是修改原始數據,由於修改副本,則沒有衝突,那麼這個修改的過程也是無等待的。最後須要作同步的只是將寫完的數據覆蓋原始數據。
因爲無等待要求比較高,實現起來比較困難,因此無鎖使用得會更加普遍一些。
這兩個定律都與加速比有關
定義了串行系統並行化後的加速比的計算公式和理論上限
加速比定義:加速比=優化前系統耗時/優化後系統耗時
舉個例子:
加速比=優化前系統耗時/優化後系統耗時=500/400=1.25
這個定理代表:增長CPU處理器的數量並不必定能起到有效的做用 提升系統內可並行化的模塊比重,合理增長並行處理器數量,才能以最小的投入,獲得最大的加速比。
說明處理器個數,串行比例和加速比之間的關係
則加速比=n-F(n-1) //推導過程略
只要有足夠的並行化,那麼加速比和CPU個數成正比
系列: