Java多執行緒--併發和並行的區別

wangchun_166發表於2018-01-16
      所有的併發處理都有排隊等候,喚醒,執行至少三個這樣的步驟.所以併發肯定是巨集觀概念,在微觀上他們都是序列被處理的,只不過資源不會在某一個上被阻塞(一般是通過時間片輪轉),所以在巨集觀上看多個幾乎同時到達的請求同時在被處理。如果是同一時刻到達的請求也會根據優先順序的不同,而先後進入佇列排隊等候執行。


      併發與並行是兩個既相似而又不相同很容易混淆的概念:併發性,是指能處理多個同時性活動的能力;並行是指同時發生的兩個併發事件,具有併發的含義,而併發則不一定並行,也亦是說併發事件之間不一定要同一時刻發生。

      併發,是在同一個cpu上同時(不是真正的同時,而是看來是同時,因為cpu要在多個程式間切換)執行多個程式。如下圖

     Java多執行緒--併發和並行的區別

     並行,是每個cpu執行一個程式,是真正的同時,之間互不干擾。如下圖:

Java多執行緒--併發和並行的區別

打個比方:

併發,就像一個人喂2個孩子,輪換著每人喂一口,表面上兩個孩子都在吃飯。

並行,就是2個人喂2個孩子,兩個孩子也同時在吃飯。


併發和並行從巨集觀上來講都是同時處理多路請求的概念。但併發和並行又有區別,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

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


①併發程式與計算不再一一對應,一個程式副本可以有多個計算。
②併發程式之間有相互制約關係,直接制約體現為一個程式需要另一個程式的計算結果,間接制約體現為多個程式競爭某一資源,如處理機、緩衝區等。
③併發程式在執行中是走走停停,斷續推進的。


在網路伺服器上,併發是指同一時刻能處理的連線數,比如,伺服器能建立1000個TCP連線,即伺服器同時維護了1000個socket,這個伺服器的併發量就是1000,但是伺服器可能只有單核或者8核,16核等,總之對這1000個socket連線的處理也是分時來做的。每個socket伺服器處理的時間如果是1s,那麼該伺服器1s內可以處理完1000個請求,如果每個socket處理100ms的話,那麼該伺服器1s內可以處理10000個請求。


在這裡我們先丟擲一些概念,如果這些概念都弄清楚了,併發和並行基本就清楚了。

會話:在我們用電腦工作時,開啟的一個視窗或一個Web頁面,我們可以把它叫做一個“會話”,擴充套件到web伺服器上,要維護很多個使用者的web頁面訪問,我們可以認為伺服器管理了多個“會話”。

併發連線數:網站有時候報錯:“HTTP Error 503. The service is unavailable”。但刷一兩下又正常,估計很可能是超過網站的最大併發連線數了。併發連線指網路流量管理裝置或代理伺服器對其業務資訊流的處理能力,是能夠同時處理的點對點連線的最大數目,它反映出裝置對多個連線的訪問控制能力和連線狀態跟蹤能力,這個引數的大小直接影響到裝置所能支援的最大資訊點數。

併發可以理解為伺服器最多維護多少個會話數,並行則不一樣,它關係的是有多少個會話是在同時進行,假如有兩臺伺服器(程式),可能並行的數量是2,而併發的數量是1000。我們還可以對比下吞吐量和頻寬的概念。

吞吐量與頻寬的區分:吞吐量和頻寬是很容易搞混的一個詞,兩者的單位都是Mbps。先來看兩者對應的英語,吞吐量:throughput;頻寬:Max net bitrate。當討論通訊鏈路的頻寬時,一般是指鏈路上每秒所能傳送的位元數,它取決於鏈路時鐘速率和通道編碼在計算機網路中又稱為線速。可以說乙太網的頻寬是10Mbps。但是需要區分鏈路上的可用頻寬(頻寬)與實際鏈路中每秒所能傳送的位元數(吞吐量)。通常更傾向於用“吞吐量”一詞來表示一個系統的測試效能。這樣,因為實現受各種低效率因素的影響,所以由一段頻寬為10Mbps的鏈路連線的一對節點可能只達到2Mbps的吞吐量。這樣就意味著,一個主機上的應用能夠以2Mbps的速度向另外的一個主機傳送資料。



相關文章