golang、c++,並發、並行(一)


golang、c++,並發、並行(一)

 

 

正式接觸golang大半個月,寫了幾個練習項目,讓人有些感概。

 

 

Golang這樣的自動化內存管理水平和並發調度能力,讓我印象很深。

 

單是那樣的內存管理水平,通過加入特定的並發優化c++內存池,我可以做到。

那種並發調度能力,通過引入復雜的調度算法,也勉強可以做到。

 

但是這兩個加在一起,配合出色的跨平台標准庫,組成這樣的一個並發友好跨平台生態,這我五年之內可能都做不到。

 

沒有用c++寫過高並發代碼的人,可能很難理解這種復雜的情緒。

這是一種,久渴的人,突然在沙漠中看到一片綠洲的感覺,驚喜萬分;而后又發現原來這個綠洲一直就在你身旁。但你卻不停錯過的悔恨。

 

c++的高並發編程,一個聽的人感覺很有逼格,寫的人累死的事情。

這是在11版前,甚至連跨平台線程模型都沒有的環境。

這是連標准庫一個小小的random生成器都沒有實現並發安全性的環境。

這是一個需要面對海量第三方庫,然后基本上沒有文檔,和一堆編譯問題和運行bug的環境。海量到,最后已經完全麻木,只感覺眼前不停地飛過一個又一個庫名,一個又一個錯誤。等你費了吃奶的勁,終於都正常運行了。才又發現,只是串行情況下運行正常。那並發運行呢?

這是一個在沙子上建立的樓房。或許一聲咳嗽后,就會頃刻倒塌。

 

就是這么一片糟糕的環境。撲面而來的蠻荒與原始,讓你懷疑還活在上個世紀,活在穿孔卡片式計算機的時代。

 

 

06年,計算機正式進入多核元年。

以前只在大型機、小型機上,使用的昂貴玩意兒,開始大規模出現在桌面pc和廉價服務器上。

 

一個讓硬件工程師,大松一口氣,“終於他媽的,從功耗、主頻陷阱解脫了。”他們成功的甩掉了一個沉重的包袱。

而軟件工程師,開始戴上了沉重的枷鎖。心里一萬頭。。。奔過。“免費午餐”正式結束。

 

 

並發、並行兩個坑爹貨正式進入大多數程序員的視野。

 

 

線程級的並發、並行

線程級並發,是一種使用多線程進行程序流程設計的方式。(和單核的指令級並行不同)

在單核時代,主要是應用於gui,網絡通信等要求低延遲高響應的場景。

線程級並行,是一部分並發在多核cpu上的一種表現。

 

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

簡單舉例:

 

程序a,包含100斤肉、50斤淀粉、10斤香辛料。

單核cpu,一座火腿腸工廠。

 

串行:

 

100斤肉-->50斤淀粉-->10斤香辛料-->火腿腸工廠-->火腿腸

把肉、淀粉、香辛料運入工廠,一分鍾(60秒)后,工廠生產出160斤火腿腸。

 

現在客戶說一分鍾太久了,要一邊運進原料一邊生產出火腿腸。降低出貨時間。

並發:

 

10斤肉-->5斤淀粉-->1斤香辛料-->火腿腸工廠-->火腿腸

(然后重復)

10斤肉-->5斤淀粉-->1斤香辛料-->火腿腸工廠-->火腿腸

。。。

 

現在可以做到0.1分鍾(6秒鍾)就生產出16斤火腿腸。

 

 

現在老板說火腿腸生產的太慢,要擴大工廠規模。於是找來了工程師,工程師說,繼續擴大單個工廠成本太高,划不來。不如,再建一座新工廠。

 

程序a,包含100斤肉、50斤淀粉、10斤香辛料。

雙核cpu,兩座火腿腸工廠,工廠a、工廠b。

 

繼續用上面並發生產方式:

(兩座工廠同時生產)

 

 

10斤肉-->5斤淀粉-->1斤香辛料-->火腿腸工廠a-->火腿腸

 

10斤肉-->5斤淀粉-->1斤香辛料-->火腿腸工廠b-->火腿腸

 

 

現在0.1分鍾(6秒鍾)運入20斤肉、10斤淀粉、2斤香辛料,

(10*2斤肉、5*2斤淀粉、1*2斤香辛料)

生產出32(16*2)斤火腿腸。

 

這就是並行。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

下一篇結合語言繼續扯。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM