1. 程式人生 > 其它 >【windows 作業系統】併發

【windows 作業系統】併發

併發

在作業系統中,是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行。其中兩種併發關係分別是同步和互斥

  • 微觀角度

所有的併發處理都有排隊等候,喚醒,執行等這樣的步驟,在微觀上他們都是序列被處理的,如果是同一時刻到達的請求(或執行緒)也會根據優先順序的不同,而先後進入佇列排隊等候執行。

  • 巨集觀角度

多個幾乎同時到達的請求(或執行緒)在巨集觀上看就像是同時在被處理。


併發就是隻有一個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的同時,其他的執行緒也可以執行。

程式設計是個人愛好