並發

在操作系統中,是指一個時間段中有幾個程序都處於已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行。其中兩種並發關系分別是同步和互斥
- 微觀角度
所有的並發處理都有排隊等候,喚醒,執行等這樣的步驟,在微觀上他們都是序列被處理的,如果是同一時刻到達的請求(或線程)也會根據優先級的不同,而先后進入隊列排隊等候執行。
- 宏觀角度
多個幾乎同時到達的請求(或線程)在宏觀上看就像是同時在被處理。
並發就是只有一個CPU資源,程序(或線程)之間要競爭得到執行機會。圖中的第一個階段,在A執行的過程中B,C不會執行,因為這段時間內這個CPU資源被A競爭到了,同理,第二個階段只有B在執行,第三個階段只有C在執行。其實,並發過程中,A,B,C並不是同時在進行的(微觀角度)。但又是同時進行的(宏觀角度)。
並行

並行指兩個或兩個以上事件(或線程)在同一時刻發生,是真正意義上的不同事件或線程在同一時刻,在不同CPU資源上(多核),同時執行。並行,不存在像並發那樣競爭CPU資源,等待執行的概念,因為並行狀態下的線程分布在不同的CPU上。
通過多線程實現並發,並行
- 在CPU比較繁忙,資源不足的時候(開啟了很多進程),操作系統只為一個含有多線程的進程分配僅有的CPU資源,這些線程就會為自己盡量多搶時間片,這就是通過多線程實現並發,線程之間會競爭CPU資源爭取執行機會。
- 在CPU資源比較充足的時候,一個進程內的多線程,可以被分配到不同的CPU資源,這就是通過多線程實現並行。
- 至於多線程實現的是並發還是並行?上面所說,所寫多線程可能被分配到一個CPU內核中執行,也可能被分配到不同CPU執行,分配過程是操作系統所為,不可人為控制。所有,如果有人問我我所寫的多線程是並發還是並行的?我會說,都有可能。
- 不管並發還是並行,都提高了程序對CPU資源的利用率,最大限度地利用CPU資源。
並發和並行的區別

可由上圖形象指出兩者的區別:
1)定義:
並發:在操作系統中,是指一個時間段中有幾個程序都處於已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
並行:在操作系統中,一組程序按獨立異步的速度執行,無論從微觀還是宏觀,程序都是一起執行的。
來個比喻:並發和並行的區別就是一個人同時吃三個饅頭和三個人同時吃三個饅頭;

在單CPU系統中,系統調度在某一時刻只能讓一個線程運行,雖然這種調試機制有多種形式(大多數是時間片輪巡為主),但無論如何,要通過不斷切換需要運行的線程讓其運行的方式就叫並發(concurrent)。而在多CPU系統中,可以讓兩個以上的線程同時運行,這種可以同時讓兩個以上線程同時運行的方式叫做並行(parallel)。
2)並發通常指提高運行在單處理器上的程序的性能;
並發是有狀態的,“具有可論證的確定性,但是實際上具有不可確定性”;
"並發"在微觀上不是同時執行的,只是把時間分成若干段,使多個進程快速交替的執行,從宏觀外來看,好像是這些進程都在執行。
使用多個線程可以幫助我們在單個處理系統中實現更高的吞吐量,如果一個程序是單線程的,這個處理器在等待一個同步I/O操作完成的時候,他仍然是空閑的。在多線程系統中,當一個線程等待I/O的同時,其他的線程也可以執行。