前幾天,參加了幾次面試,結(jié)果很糟糕骂际。一來是因?yàn)闆]有做準(zhǔn)備,二是平時(shí)對(duì)那些概念也沒有太注意,只是看到覺得理所當(dāng)然是這樣钦椭,并沒有仔細(xì)考究拧额!現(xiàn)在發(fā)覺這根本就是一種無求知欲的表現(xiàn)碑诉,這里決定好好溫習(xí)一下之前的知識(shí)。
背景知識(shí)
進(jìn)程與線程
進(jìn)程的英文名是 Process侥锦,是計(jì)算機(jī)程序執(zhí)行后的實(shí)例进栽,她包含了程序代碼和當(dāng)前的所有資源。在一般的操作系統(tǒng)中恭垦,她可能是由多個(gè)線程組成來完成并發(fā)[Concurrency]任務(wù)快毛,而多個(gè)進(jìn)程應(yīng)該是完成并行(Parallelism)任務(wù)。關(guān)于并發(fā)與并行下面也會(huì)涉及到相關(guān)區(qū)別番挺。
線程的英文名是 Thread唠帝,她是對(duì)計(jì)算機(jī)調(diào)度的一個(gè)最小粒度,她是包含在一個(gè)進(jìn)程中的玄柏,一個(gè)進(jìn)程中的線程是共享一片內(nèi)存區(qū)域襟衰,實(shí)質(zhì)上講他們并不是一個(gè)很實(shí)體話可東西,比較抽象粪摘,需要加上時(shí)間的維度才能區(qū)別開來瀑晒。
下面是一張Wiki百科上的圖,能夠很清晰的表明線程與進(jìn)程的關(guān)系徘意。
個(gè)人拙見以為進(jìn)程是與計(jì)算機(jī)的核數(shù)(Processor)有關(guān)的苔悦,一般地,幾核的CPU就應(yīng)該能產(chǎn)生幾個(gè)進(jìn)程椎咧。
我簡(jiǎn)單的打個(gè)比方玖详,比如一臺(tái)計(jì)算機(jī)是一家公司,不考慮其他的邑退,加入把研發(fā)部門比做CPU的話竹宋,一個(gè)公司一般會(huì)只有一個(gè)研發(fā)部門(假設(shè)只研發(fā)一款產(chǎn)品)。公司所有的研發(fā)工作都是交由這個(gè)研發(fā)部門負(fù)責(zé)地技,可能這個(gè)研發(fā)部門會(huì)有不止一個(gè)的研發(fā)小組蜈七,都可以做同樣的一件研發(fā)工作,那么計(jì)算機(jī)中的內(nèi)核就可以類似于研發(fā)小組莫矗,他們可以同時(shí)的做相同的工作飒硅,但如果他們需要同時(shí)使用公司的生產(chǎn)線那么這可能就存在問題,下面再來說作谚。如果公司給研發(fā)組2放假了三娩,那么他們就可以不用干活輕松的休息,這是公司配發(fā)了研發(fā)任務(wù)應(yīng)該是由研發(fā)組1來完成妹懒,如果公司又給了一個(gè)任務(wù)給研發(fā)組1雀监,那么研發(fā)組就屬于并發(fā)狀態(tài),他們的做任務(wù)就是線程。他們小組的leader開會(huì)說会前,根據(jù)公司的章程好乐,咱們接到了兩個(gè)任務(wù),那我們就按周輪流來做吧瓦宜。在計(jì)算機(jī)中這可能就是有操作系統(tǒng)來決定的蔚万。假設(shè)是每個(gè)星期一切換任務(wù),那么周一的時(shí)候的工作效率可能會(huì)比較低临庇,因?yàn)橐ㄙM(fèi)不少時(shí)間來做任務(wù)的切換工作反璃,收集資料和整理資料,這就是線程切換的開銷假夺。
假如任務(wù)一需要使用公司的計(jì)算機(jī)房淮蜈,任務(wù)二也需要,我們從現(xiàn)實(shí)的宏觀角度來看的話侄泽,感覺這完全沒有問題礁芦,這周機(jī)房處理任務(wù)一,下周機(jī)房處理任務(wù)二悼尾。但是仔細(xì)想想其實(shí)是存在問題的柿扣,加入我們?cè)谥芰浇灰恍?shù)據(jù)給機(jī)房處理,比如說模型訓(xùn)練闺魏,可能在我們交接任務(wù)的約定時(shí)間周一的時(shí)候未状,他們還沒有處理完成,而小組1的又給了他們?nèi)蝿?wù)析桥,那么這就存在的資源問題司草,機(jī)房可能會(huì)在門口掛上了“任務(wù)中,請(qǐng)勿打擾”泡仗,所以就有了鎖的這個(gè)概念埋虹,表示現(xiàn)在忙,暫時(shí)不能進(jìn)行訪問娩怎。
異步回調(diào)
我們傳統(tǒng)的過程式程序可能就跟比較古板的小組1一樣搔课,到期咱就切換任務(wù)嗎。他們覺得這種方式還是不能把工作效率提高到最高截亦。他們開會(huì)就討論怎么能提高這個(gè)效率呢爬泥,有個(gè)外號(hào)蟒蛇的就說呀,他覺得有時(shí)候等PCB的測(cè)試板實(shí)在是比較耗時(shí)間崩瓤,有時(shí)候一兩天啥事沒有袍啡,就是干等著板子打出來做測(cè)試,這期間也不知道干啥却桶。不過最近有個(gè)朋友告訴我一個(gè)比較好的工作方法境输,先做好任務(wù)的規(guī)劃,把哪些可以同時(shí)做的事情列出來,以后就按照這個(gè)表來做嗅剖,有空閑就去做其他的事情蛋逾,等前面做的東西可以繼續(xù)了,就繼續(xù)回頭做前面的事情窗悯。
他們新來外號(hào)面條的就說,你們連這個(gè)都不懂啊偷拔,我一直都是這么干的蒋院。
前面蟒蛇提到的問題就是平時(shí)經(jīng)常碰到的阻塞,比如磁盤IO莲绰,網(wǎng)絡(luò)IO這些比較耗時(shí)間的操作欺旧。他那個(gè)朋友(Gevent)教的方法就是異步。
異步回調(diào)蛤签,就是遇到阻塞時(shí)辞友,就去做其他的事情(新的線程),當(dāng)之前的產(chǎn)生結(jié)果了就把那個(gè)結(jié)果拿回來處理震肮,但是這不是在你原來的形成規(guī)劃中称龙。
對(duì)于上面的例子,蟒蛇可能就對(duì)PCB生產(chǎn)線上的人說戳晌,他就不在這守著了鲫尊,做好給個(gè)電話,他自己去取就好了沦偎,或者陪人送到他辦公室疫向。這就是異步的通訊與回調(diào)機(jī)制,打電話通知他就是告訴他完成的這個(gè)消息豪嚎,他在過來取走搔驼;而寄到他辦公室,就是直接把執(zhí)行的結(jié)果返回到預(yù)定的地方侈询,他會(huì)每天都檢查一下是否有結(jié)果了舌涨。
并發(fā)
開始說說重點(diǎn),并發(fā)了妄荔。記得有個(gè)“七天七”系列的書泼菌,當(dāng)然這和國(guó)內(nèi)“X天”系列不一樣,這個(gè)系列本本算得好書啦租,其中就有一本是《七天七并發(fā)》哗伯,可惜當(dāng)時(shí)在圖書館找到時(shí),我快畢業(yè)了篷角。
有不少編程語(yǔ)言實(shí)在語(yǔ)言級(jí)別實(shí)現(xiàn)的并發(fā)焊刹,例如,Erlang、Haskell虐块、Scala俩滥、Clojure,以及比較年輕的Golang贺奠。相信這些都聽過霜旧,我個(gè)人是真的沒有去仔細(xì)研究過,借這次機(jī)會(huì)好好看看儡率。
并發(fā)模型
- Communicating Sequential Processes
- Actor