執行緒並行學習筆記
一、執行緒並行相關概念
同步(Synchronous)和非同步(Asynchronous)
同步和非同步的本質區別是是否需要等待,比如一個方法在執行,必須等前面一個方法程執行完成,才可以執行,這就是同步。如果不需要等上一個方法執行完成,並行或者併發執行,這就是非同步呼叫。
併發(Concurrency)和並行(Parallelism)
併發和並行兩個概念很容易混淆。解釋起來意思也差不多,不過說起來,並行才是真正意義上的並行執行,併發只是執行緒的交替執行,有可能存在序列的情況。
在單核CPU的系統,執行緒只能是併發的,而不能支援並行,並行執行只能存在與多核CPU的系統。
臨界區
臨界區,可以理解為公共的資源或者說共享資料。臨界區具有保護性,也就是說,只能一個執行緒佔用臨界區,一旦一個執行緒佔了臨界區,另外一個執行緒是不予許再佔用的,必須等執行緒釋放了才行。
阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞是執行緒的一種比較嚴重的情況,從前面我們知道了臨界區只能允許一個執行緒佔用,假如一個執行緒因為執行時間過長,佔用了臨界區,不掛起,其它想要佔用臨界區的執行緒只能等待,這種情況就容易造成執行緒阻塞。非阻塞的話就相反了,指所有執行緒都正常執行,不會出現執行緒佔臨界區不掛起的情況。
飢餓(Starvation)、死鎖(Deadlock)和活鎖(Livelock)
飢餓,有些情況可能是一個執行緒優先順序太低了,每次都被其它執行緒佔用了,導致改執行緒一種不能佔用臨界區。也有一些情況是上一個執行緒執行時間太長了,一直沒釋放,導致其它執行緒都不能佔用臨界區,這也是造成執行緒飢餓。
死鎖有可能是因為執行緒死迴圈呼叫等等情況造成的,一旦出現這種情況估計就得人工排查了。
活鎖,解釋一下,一般就是這樣的情況,因為執行緒互相掛起臨界區,給其它執行緒用,互相“謙讓”,導致資源在兩個或者幾個執行緒之間跳到,這種情況就是活鎖。
二、並行的兩個重要定律
Amdahi定律
Amdahi定律定義了序列系統並行化後的加速比公式。
加速比定義:加速比 = 優化前系統耗時 / 優化後系統耗時
加速比越高,說明優化越明顯。簡單介紹一下Amdahi定律公式的推導。
優化後耗時T_n=T1(F+1/n(1-F)),其中T1表示優化前耗時,F表示序列比例,(1-F)表示並行比例,下標n就是處理器的個數。
匯入加速比公式,也就是T1/T_n,也就是1/(F + 1/n(1-F)),公式只是進行簡單介紹。
從公式可以看出,加速比是和序列比例F成反比的,從公式可以看出增加cpu的個數僅僅是一種提供加速比的方法,增加cpu個數的同時,還可以提供降低序列比例來做,也就是序列比例F越低,加速比也就越高
Gustafson定律
Custafson公式也是並行的一個比較重要的公式,現在介紹一下Custafson公式的推導。
定義一下序列執行時間為a,並行執行時間為b。即單核CPU情況,執行時間為a+b總執行時間為a+nb,n表示CPU個數。
//定義序列比例
F=a/(a+b)
//得到加速比
s(n)=a+nb/a+b=a/a+b + nb/a+b = F + n*(b-a+a)/a+b = F + n(1-F)
從公式可以看出,如果序列比例足夠小的情況,加速比其實就是約等於處理器個數,也就是說通過加多CPU的個數就能提高加速比。
兩個公式看起來似乎有點矛盾,其實不然,兩個公式只是從不同角度分析問題。Amdahi是說在序列比例一定時,通過加CPU的方法是有上限的,通過降低序列比例同時增加cpu個數可以提高加速比。Custafson是說在序列比較趨於很小的情況,從公式可以看出,加cpu就可以提高加速比