原文**:從序列到並行,從並行到分布式
假設有ab兩個任務,則序列、並行、併發的區別如圖1所示。
序列
a和b兩個任務執行在乙個cpu執行緒上,在a任務執行完之前不可以執行b。即,在整個程式的執行過程中,僅存在乙個執行上下文,即乙個呼叫棧乙個堆。程式會按順序執行每個指令。
並行
並行性指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境下,並行性使多個程式同一時刻可在不同cpu上同時執行。比如,a和b兩個任務可以同時執行在不同的cpu執行緒上,效率較高,但受限於cpu執行緒數,如果任務數量超過了cpu執行緒數,那麼每個執行緒上的任務仍然是順序執行的。
併發
併發指多個執行緒在巨集觀(相對於較長的時間區間而言)上表現為同時執行,而實際上是輪流穿插著執行,併發的實質是乙個物理cpu在若干道程式之間多路復用,其目的是提高有限物理資源的執行效率。 併發與並行序列並不是互斥的概念,如果是在乙個cpu執行緒上啟用併發,那麼自然就還是序列的,而如果在多個執行緒上啟用併發,那麼程式的執行就可以是既併發又並行的。
而分布式和並行的區別如下:
分布式
分布式在並行處理的基礎上,強調任務正在執行的物理裝置,如處理器、記憶體等等硬體,在物理上是分開的。而平行計算是指在一台計算機上的計算,在物理上不分開。
假設有a,b兩個任務,任務a需要計算1-100000之間所有質數的和,任務b需要計算100001-200000之間所有質數的和則採用序列的方法設計的程式如下:
public class main
//序列計算
private static void serial()
time2=system.currenttimemillis();
system.out.println("1-100000之間質數和為"+count+" 耗時:"+(time2- time1) + "毫秒");
count = 0;
for(int i=100001;i<=200000;++i)
time3 = system.currenttimemillis();
system.out.println("100001-200000之間質數和為"+count+" 耗時:"+(time3 - time2) + "毫秒");
system.out.println("總耗時:"+ (time3 - time1) + "毫秒");
}//主函式
public static void main(string args)
}
在序列計算的程式中,只有乙個cpu執行緒,且該執行緒按順序執行ab兩個任務。程式執行結果如下:
採用併發的方法設計的程式如下:
public class main
public static void main(string args)
private static void serialconcurrency()
else if(task == 2 && j++<=200000)
else
}system.out.println("1-100000之間質數和為"+count1);
system.out.println("100001-200000之間質數和為"+count2);
system.out.println("總耗時:"+(system.currenttimemillis() - time) + "毫秒");}}
在併發計算的程式中,同樣只有乙個cpu執行緒,但是該執行緒會在ab兩個任務之間進行切換,可以發現,併發計算的總耗時反而大於序列計算,這是因為cpu在任務切換過程中需要消耗一定時間。程式執行結果如下:
採用並行的方法設計的程式如下:
public class main
public static void main(string args) throws interruptedexception
time2 = system.currenttimemillis();
system.out.println("總耗時:"+(time2 - time1)+"毫秒");
}}class task implements runnable
public void run()
system.out.println(string.format("%d-%d之間質數和為%d,耗時:%d毫秒",start,end,count,(system.currenttimemillis()- time)));}}
在平行計算的程式中,ab任務各占用乙個cpu執行緒,ab任務同時執行,總共耗費的時間約等於ab任務的最長耗時,程式執行結果如下:
由上表可知並行的總耗時是最小的,效率最高(如果ab兩個任務耗時更接近,則平行計算的效率將更高)。但由於平行計算受限於cpu執行緒數,當計算量超出單台計算機的計算能力時,人們就開始考慮使用多台計算機同時處理乙個任務,分布式計算應用而生。分布式計算將任務分解成許多小的部分,分配給多台計算機進行處理,從而整體上節約了計算時間。hadoop的mapreduce就是一種分布式計算框架,我們之後會對mapreduce進行詳細的**。
併發計算 VS 平行計算
我在網上看到很多講併發計算與平行計算區別的文章,感覺很多講得不是很抽象就是不全面,因此我決定自己好好總結一下。閒話少說,先看一張圖。仔細看一下這張圖,先有個大概印象再繼續往下讀。loading 看完上面的圖之後,這是我總結的幾點 note 為了更好地比較並行與併發計算,我加入了序列計算。序列計算 平...
併發計算 VS 平行計算
並行 parallelism 是指在具有多個處理單元 如gpu或者多核cpu 的系統上,通過將計算或資料劃分為多個部分,將各個部分分配到不同的處理單元上,各處理單元相互協作,同時執行,已達到加快求解速度或者提高求解問題規模的目的。併發是乙個程式 演算法或者問題的可分解屬性,它由多個順序不依賴性或者區...
併發計算 平行計算 序列計算 分布式計算 概念簡述
併發計算 concurrent computing 多個任務在同一時間段內從開始執行到執行結束,在這段時間內,每乙個時刻都只有乙個程式執行,並且所有的任務都是在同乙個處理器上執行。序列計算 sequential computing 指的是多個程式在同乙個處理器上被執行,只有當當前的程式執行結束後,下...