關於Concurrent的幾個概念

1.1 同步和異步多線程

首先這裏說的同步和異步是指函數/方法調用方面。併發

很明顯,同步調用會等待方法的返回,異步調用會瞬間返回,可是異步調用瞬間返回並不表明你的任務就完成了,他會在後臺起個線程繼續進行任務。
 異步

1.2 併發和並行函數

併發和並行在外在表象來講,是差很少的。由圖所示,並行則是兩個任務同時進行,而併發呢,則是CPU在多個任務間的切換執行,一會作任務1,一會又切換作任務2。單個cpu是不能作並行的,只能經過CPU時鐘片的切換作併發。性能

1.3 臨界區優化

臨界區用來表示一種公共資源或者說是共享數據,能夠被多個線程使用,可是每一次,只能有一個線程使用它,一旦臨界區資源被佔用,其餘線程要想使用這個資源,就必須等待。


 spa

1.4 阻塞和非阻塞操作系統

阻塞和非阻塞一般形容多線程間的相互影響。好比一個線程佔用了臨界區資源,那麼其它全部須要這個資源的線程就必須在這個臨界區中進行等待,等待會致使線程掛起。這種狀況就是阻塞。此時,若是佔用資源的線程一直不肯意釋放資源,那麼其它全部阻塞在這個臨界區上的線程都不能工做。線程

非阻塞容許多個線程同時進入臨界區。進程

因此阻塞的方式,通常性能不會太好。根據通常的統計,若是一個線程在操做系統層面被掛起,作了上下文切換了,一般狀況須要8W個時間週期來作這個事情。

 

1.5 死鎖、飢餓、活鎖

所謂死鎖:是指兩個或兩個以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象,若無外力做用,它們都將沒法推動下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。就如同下圖中的車都想前進,卻誰都沒法前進。

可是死鎖雖然說是很差的現象,可是它是一個靜態的問題,一旦發生死鎖,進程被卡死,cpu佔有率也是0,它不會佔用cpu,它會被調出去。相對來講仍是比較好發現和分析的。

與死鎖相對應的是活鎖。活鎖,指事物1可使用資源,但它讓其餘事物先使用資源;事物2可使用資源,但它也讓其餘事物先使用資源,因而二者一直謙讓,都沒法使用資源。

舉個例子,就如同你在街上遇到我的,恰好他朝着你的反方向走,與你正面碰到,大家都想讓彼此過去。你往左邊移,他也往左邊移,兩人仍是沒法過去。這時你往右邊移,他也往右邊移,如此循環下去。

一個線程在取得了一個資源時,發現其餘線程也想到這個資源,由於沒有獲得全部的資源,爲了不死鎖把本身持有的資源都放棄掉。若是另一個線程也作了一樣的事情,他們須要相同的資源,好比A持有a資源,B持有b資源,放棄了資源之後,A又得到了b資源,B又得到了a資源,如此反覆,則發生了活鎖。活鎖會比死鎖更難發現,由於活鎖是一個動態的過程。

飢餓是指某一個或者多個線程由於種種緣由沒法得到所須要的資源,致使一直沒法執行。

2.1 Amdahl定律

定義了串行系統並行化後的加速比的計算公式和理論上限

加速比定義:加速比=優化前系統耗時/優化後系統耗時

舉個例子:

加速比=優化前系統耗時/優化後系統耗時=500/400=1.25

這個定理代表:增長CPU處理器的數量並不必定能起到有效的做用,提升系統內可並行化的模塊比重,合理增長並行處理器數量,才能以最小的投入,獲得最大的加速比。

2.2 Gustafson定律

說明處理器個數,串行比例和加速比之間的關係

則加速比=n-F(n-1) //推導過程略

只要有足夠的並行化,那麼加速比和CPU個數成正比

相關文章
相關標籤/搜索