麥吉爾大學(xué)(加拿大)校訓(xùn):“天道酬勤∑贪眨”
? ? 曾幾何時艇挨,并行計算/并發(fā)處理刮起了一陣風(fēng),對于Java開發(fā)者更是評定中高級的一項硬性指標(biāo)韭赘;在面試中也是逢面必問缩滨,對此我也只能呵呵,因為我在面試中也會問泉瞻,哈哈脉漏。Linus Torvalds說過,忘掉那該死的并行吧袖牙!只看這一句話那肯定是太過了侧巨,也被國內(nèi)人士過分解讀,斷章取義鞭达,其實有個小前提是排除圖形計算和服務(wù)器端司忱。隨著前后端的分離,在構(gòu)建大型服務(wù)群方面畴蹭,Java主導(dǎo)的地位越發(fā)突出烘贴。因此,掌握高并發(fā)撮胧,如何更好地利用多核處理器桨踪,的確是工作中特別重要的一項技能。
? ? 本人工作年限有限芹啥,技術(shù)還有待深耕锻离,只能從并發(fā)基礎(chǔ)/源碼剖析/工作積累幾個方面淺顯地聊聊并發(fā)處理铺峭,這是根基,能夠系統(tǒng)地把這些根基性的東西梳理一遍汽纠,并靈活地在工作中使用卫键,其實在國內(nèi)就已經(jīng)達(dá)到中級的水平了。不扯了虱朵,先聊聊一些發(fā)展歷程和基礎(chǔ)概念性的東西莉炉,打卡上車。
一 操作系統(tǒng)的演變歷程
? ? 對于操作系統(tǒng)的完整發(fā)展歷程可自行維基碴犬,這里只談下自己的理解絮宁,雅頌俗說,如果有被誤導(dǎo)服协,請自行甄變绍昂。
? ? 1 串行處理
? ? 第一代計算機(jī)主要在高精專的機(jī)構(gòu)使用,主要進(jìn)行大量非人力可為的計算偿荷。它是沒有操作系統(tǒng)的窘游,直接與硬件打交道,輸入機(jī)器指令跳纳,計算機(jī)處理忍饰,所以稱之為串行。這樣計算機(jī)的使用效率太低了寺庄,必將上下而求索艾蓝。
? ? 2 批處理系統(tǒng)
? ? 針對使用率的問題,人們就把需要執(zhí)行的命令铣揉,預(yù)先寫到磁帶上,形成一個批任務(wù)清單餐曹,再交給計算機(jī)執(zhí)行逛拱,執(zhí)行后的結(jié)果再輸出到磁帶上,這樣大大提升了計算機(jī)的使用率台猴。針對CPU密集型的人物似乎還好朽合,但遇到執(zhí)行IO密集型的任務(wù),計算機(jī)的使用效率就降下來了饱狂。人們肯定得想招呀曹步,能不能在執(zhí)行IO密集型的時候再讓CPU處理另一個程序?
? ? 3 集成電路
? ? 計算機(jī)必須能夠載入多個程序休讳,在不同的時刻能夠進(jìn)行調(diào)度和切換讲婚。怎么描述每個程序呢,這就是進(jìn)程俊柔,代表每個獨立的程序筹麸,每個進(jìn)程都具有獨立的內(nèi)存空間和獨立保存自己的運行狀態(tài)活合;由CPU調(diào)度切換,彼此之間不影響物赶。這是現(xiàn)代操作系統(tǒng)的重要基礎(chǔ)白指,發(fā)明了進(jìn)程。
? ? 4 用戶交互
? ? 上述的系統(tǒng)只能小范圍商用酵紫,系統(tǒng)中每個進(jìn)程內(nèi)部是串行執(zhí)行的告嘲,用戶是無法進(jìn)行交互響應(yīng)的,毫無交互性可言奖地,也就無法推廣橄唬。在渴望交互的強(qiáng)烈訴求下,誕生了個人計算機(jī)鹉动,各種現(xiàn)代操作系統(tǒng)應(yīng)運而生轧坎。如何解決交互問題,繼續(xù)上述的思路泽示,把程序劃分不同的模塊缸血,把進(jìn)程拆解為多個子任務(wù),每個子任務(wù)可以作為用戶交互的單元械筛,線程由此而來捎泻。
二 進(jìn)程線程詳解
? ? 上述梳理下操作系統(tǒng)的歷程,主要是為了引出進(jìn)程和線程埋哟。進(jìn)程/線程的概念可自行百度笆豁,我們通過上述基本可以得出些結(jié)論:
? ? 1 進(jìn)程之間是相互獨立的,具有隔離的內(nèi)存空間赤赊,獨立保存自身的運行狀態(tài)和運行位置闯狱;
? ? 2 線程是共享進(jìn)程內(nèi)部的資源和空間的,當(dāng)然線程也可邏輯劃分自身獨立的空間抛计;
? ? 3 進(jìn)程就像系統(tǒng)上的每個獨立應(yīng)用哄孤,每個進(jìn)程包含多個線程;
? ? 4 進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的基本單位吹截,這讓操作系統(tǒng)并發(fā)性成為可能瘦陈;
? ? 5 線程是操作系統(tǒng)進(jìn)行調(diào)度的基本單位,使進(jìn)程內(nèi)部并發(fā)成為可能波俄,這是高并發(fā)的戰(zhàn)場晨逝。
三 并發(fā)引發(fā)的思考
? ? 我們知道,線程屬于進(jìn)程懦铺,共享進(jìn)程內(nèi)部的資源和空間捉貌,多個線程在同時進(jìn)行處理的時候會引發(fā)沖突嘛,有沖突怎么處理?這也是本系列存在的意義昏翰,后續(xù)會通過JMM內(nèi)存模型/鎖/并發(fā)工具等組合拳亮招苍匆。
? ? 多線程的性能一定優(yōu)于單線程嘛?
? ? 這是個好頻繁的問題棚菊,這是一個無法從單一維度回答的問題浸踩,需要考慮應(yīng)用的運行環(huán)境,是多核CPU嘛统求,程序中主要耗時任務(wù)是CPU密集型還是IO密集型等等检碗,我們在系列后續(xù)會聊到,煩請多多思考码邻!
特此聲明:
分享文章有完整的知識架構(gòu)圖折剃,將從以下幾個方面系統(tǒng)展開:
1 基礎(chǔ)(Linux/Spring boot/并發(fā))
2 性能調(diào)優(yōu)(jvm/tomcat/mysql)
3 高并發(fā)分布式
4 微服務(wù)體系
如果您覺得文章不錯,請關(guān)注阿倫故事像屋,您的支持是我堅持的莫大動力怕犁,在此受小弟一拜!
每篇福利: