如何給女朋友解釋什麼是併發和並行

Java團長_發表於2018-11-11

640

某天下班後,我在家裡進行電話面試,問到面試者這樣一個問題:"能不能簡單介紹一下你理解的併發和並行,並說明一下他們之間的關係"。但是面試者回答的並不好,所以我在面試評價中寫到:"對併發和並行的概念不清楚"。這時,女朋友看到這句話。


640

640

640

640

併發和並行最開始都是作業系統中的概念,表示的是CPU執行多個任務的方式。這兩個概念極容易混淆。

640

640

所謂"同時"進行

我們現在使用的windows作業系統,是可以"同時"做很多件事兒的。比如我們可以一邊看電影,一邊聊QQ;一邊聽歌,一邊打遊戲。

但是,這所謂的"同時",在作業系統底層可能並不是真正的意義上的"同時"。

實際上,對於單CPU的計算機來說,在CPU中,同一時間是隻能幹一件事兒的。為了看起來像是“同時幹多件事”,Windows這種作業系統是把CPU的時間劃分成長短基本相同的時間區間,即”時間片”,通過作業系統的管理,把這些時間片依次輪流地分配給各個應用使用。

這樣,給使用者的感覺是他在同時的進行聽歌和打遊戲,實際上,在作業系統中,CPU是在遊戲程式和音樂播放器程式之間來回切換執行的。

作業系統時間片的使用是有規則的:某個作業在時間片結束之前,整個任務還沒有完成,那麼該作業就被暫停下來,放棄CPU,等待下一輪迴圈再繼續做。此時CPU又分配給另一個作業去使用。

我們把目光聚焦在CPU的執行上,把這個過程放大的話,CPU就好像是一個電話亭。多個使用者並不是同一時間在使用這個電話亭中的電話的,而是輪流使用的。

由於計算機的處理速度很快,只要時間片的間隔取得適當,那麼一個使用者作業從用完分配給它的一個時間片到獲得下一個CPU時間片,中間有所”停頓”,但使用者察覺不出來。

所以,在單CPU的計算機中,我們看起來“同時幹多件事”,其實是通過CPU時間片技術,併發完成的。

640

640

併發

併發(Concurrent),在作業系統中,是指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行。

就想前面提到的作業系統的時間片分時排程。打遊戲和聽音樂兩件事情在同一個時間段內都是在同一臺電腦上完成了從開始到結束的動作。那麼,就可以說聽音樂和打遊戲是併發的。

640

640

並行

並行(Parallel),當系統有一個以上CPU時,當一個CPU執行一個程式時,另一個CPU可以執行另一個程式,兩個程式互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。

這裡面有一個很重要的點,那就是系統要有多個CPU才會出現並行。在有多個CPU的情況下,才會出現真正意義上的『同時進行』。

640

640

併發與並行

我們兩個人在吃午飯。你在吃飯的整個過程中,吃了米飯、吃了蔬菜、吃了牛肉。吃米飯、吃蔬菜、吃牛肉這三件事其實就是併發執行的。對於你來說,整個過程中看似是同時完成的的。但其實你是在吃不同的東西之間來回切換的。

還是我們兩個人吃午飯。在吃飯過程中,你吃了米飯、蔬菜、牛肉。我也吃了米飯、蔬菜和牛肉。我們兩個人之間的吃飯就是並行的。兩個人之間可以在同一時間點一起吃牛肉,或者一個吃牛肉,一個吃蔬菜。之間是互不影響的。

640
所以,併發是指在一段時間內巨集觀上多個程式同時執行。並行指的是同一個時刻,多個任務確實真的在同時執行。

640

640

640

640

併發和並行的區別

併發,指的是多個事情,在同一時間段內同時發生了。  
並行,指的是多個事情,在同一時間點上同時發生了。

併發的多個任務之間是互相搶佔資源的。  
並行的多個任務之間是不互相搶佔資源的、

只有在多CPU的情況中,才會發生並行。否則,看似同時發生的事情,其實都是併發執行的。

640

就像上面這張圖,只有一個咖啡機的時候,一臺咖啡機其實是在併發被使用的。而有多個咖啡機的時候,多個咖啡機之間才是並行被使用的。

640

640

640

640

PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發。

(完)

640?

Java團長

專注於Java乾貨分享

640

掃描上方二維碼獲取更多Java乾貨


相關文章