吃個快餐都能學到序列、並行、併發

LieBrother發表於2019-07-10

吃個快餐都能學到序列、並行、併發

Java 多執行緒系列文章第 3 篇

這篇文章繼續來嘮嘮概念,講這三兄弟:序列(Serial)並行(Parallel)併發(Concurrent)

吃快餐

出門在外吃飯是一件頭疼的事,用我大學舍友一句話形容:如果不是沒吃飯不能活,他是不會吃飯的。不管學生還是工作者,吃飯都是一件需要揪心的事,有食堂的企業員工糾結要在公司食堂吃飯還是在外面吃飯,沒食堂的企業員工則糾結是吃麵還是吃米飯。每到飯點,和同事去吃飯都會問一句廢話:吃啥?然後相視而笑,繼續吃快餐。。。

我們吃快餐也能學點知識,我來給大家一一道來。快餐有一個很明顯的特點就是:排隊!!! 目前我見過的有下面幾種排隊方式,剛好和我們們今天要講的序列併發並行一一對應。

現在我們公司附近的快餐,人少的時候,就是排一條隊,如下圖所示,每個人按順序排,一直往前走,如果看到想吃的菜,就用手指一指,快餐員工就會給你打菜,這個應該是很多快餐店都採用的方式,容易管理,但是有一點需要強調的就是如果一個同學只想吃米飯和豆芽,他還是需要排一整隊到最後的結賬臺結賬。這其實就是我們們計算機世界裡面的序列,一條隊伍,依次有序的執行著。

序列

不過一到 12 點高峰期上面那種排隊方式就撐不住了,分分鐘排隊排到外面曬太陽,這時為了提高效率,因為快餐店還有一片空地,所以又加了一套打菜裝備和員工,這時很好的解決了一條隊伍太長的問題,這時就是並行了,2 套打菜裝備和員工各自互不干涉,完全獨立,每套裝備能夠解決每個顧客的點菜需求。當然這要求比較高,需要餐廳有足夠的空間可以放下兩套裝備,並且需要僱傭多一倍的員工來為顧客打菜,這裡就類似計算機的雙核。

並行

除了上面的兩種快餐排隊方式,還見過下面這種的,只有一套打菜裝備,但是卻有很多個隊,每個菜排一條隊(現實中其實不止一個菜,而是多個菜,這裡畫圖就簡化成一個菜),每個人就只需要排自己想吃的菜的隊伍,這一道道菜就像計算機的各個資源,比如 CPU、IO 等等,人就像一個一個程式,有些只需要 CPU 計算資源,有些還要 IO 資源,各取所需,這種方式就是併發。這種打菜方式和上面第一種所需要的資源是一樣的:一套打菜裝備和員工。每個顧客最終都需要走到結賬這個步驟,而結賬只有一個,也就是類似計算機的單核。

併發

總結

那麼迴歸到計算機世界,這三者是什麼東西呢?早期計算機只有一個 CPU,也就是所謂的單核計算機,只有一個 CPU 去執行任務,所以只能是一個任務一個任務的跑,每個任務跑完才讓下一個任務跑,也就是序列的,後面因為程式和執行緒概念的提出與實現,它們使得任務以程式的方式執行,拆分成多個時間片執行,而不是一次執行執行完任務,這樣子在一個 CPU 執行中可以有多個任務在併發執行,這時還是隻有一個 CPU,一個時間點只有一個任務在執行,而並行是因為 CPU 硬體的發展,出現多核 CPU,所以實現了真正的同一時間點能有多個任務在執行。

上面用快餐排隊現象給大家解釋了序列並行併發這三個概念,大家理解了麼?如果不理解可能是我講得不夠透徹,可以留言跟我提一提建議;如果理解了,可否幫忙轉發一下,多謝啦!

推薦閱讀

泡一杯茶,學一學同非同步

程式知多少?

設計模式看了又忘,忘了又看?

後臺回覆『設計模式』可以獲取《一故事一設計模式》電子書

覺得文章有用幫忙轉發&點贊,多謝朋友們!

LieBrother

相關文章