前幾天,參加了幾次面試,結(jié)果很糟糕。一來是因為沒有做準備,二是平時對那些概念也沒有太注意,只是看到覺得理所當(dāng)然是這樣,并沒有仔細考究!現(xiàn)在發(fā)覺這根本就是一種無求知欲的表現(xiàn),這里決定好好溫習(xí)一下之前的知識。
背景知識
進程與線程
進程的英文名是 Process,是計算機程序執(zhí)行后的實例,她包含了程序代碼和當(dāng)前的所有資源。在一般的操作系統(tǒng)中,她可能是由多個線程組成來完成并發(fā)[Concurrency]任務(wù),而多個進程應(yīng)該是完成并行(Parallelism)任務(wù)。關(guān)于并發(fā)與并行下面也會涉及到相關(guān)區(qū)別。
線程的英文名是 Thread,她是對計算機調(diào)度的一個最小粒度,她是包含在一個進程中的,一個進程中的線程是共享一片內(nèi)存區(qū)域,實質(zhì)上講他們并不是一個很實體話可東西,比較抽象,需要加上時間的維度才能區(qū)別開來。
下面是一張Wiki百科上的圖,能夠很清晰的表明線程與進程的關(guān)系。
個人拙見以為進程是與計算機的核數(shù)(Processor)有關(guān)的,一般地,幾核的CPU就應(yīng)該能產(chǎn)生幾個進程。
我簡單的打個比方,比如一臺計算機是一家公司,不考慮其他的,加入把研發(fā)部門比做CPU的話,一個公司一般會只有一個研發(fā)部門(假設(shè)只研發(fā)一款產(chǎn)品)。公司所有的研發(fā)工作都是交由這個研發(fā)部門負責(zé),可能這個研發(fā)部門會有不止一個的研發(fā)小組,都可以做同樣的一件研發(fā)工作,那么計算機中的內(nèi)核就可以類似于研發(fā)小組,他們可以同時的做相同的工作,但如果他們需要同時使用公司的生產(chǎn)線那么這可能就存在問題,下面再來說。如果公司給研發(fā)組2放假了,那么他們就可以不用干活輕松的休息,這是公司配發(fā)了研發(fā)任務(wù)應(yīng)該是由研發(fā)組1來完成,如果公司又給了一個任務(wù)給研發(fā)組1,那么研發(fā)組就屬于并發(fā)狀態(tài),他們的做任務(wù)就是線程。他們小組的leader開會說,根據(jù)公司的章程,咱們接到了兩個任務(wù),那我們就按周輪流來做吧。在計算機中這可能就是有操作系統(tǒng)來決定的。假設(shè)是每個星期一切換任務(wù),那么周一的時候的工作效率可能會比較低,因為要花費不少時間來做任務(wù)的切換工作,收集資料和整理資料,這就是線程切換的開銷。
假如任務(wù)一需要使用公司的計算機房,任務(wù)二也需要,我們從現(xiàn)實的宏觀角度來看的話,感覺這完全沒有問題,這周機房處理任務(wù)一,下周機房處理任務(wù)二。但是仔細想想其實是存在問題的,加入我們在周六到交一些數(shù)據(jù)給機房處理,比如說模型訓(xùn)練,可能在我們交接任務(wù)的約定時間周一的時候,他們還沒有處理完成,而小組1的又給了他們?nèi)蝿?wù),那么這就存在的資源問題,機房可能會在門口掛上了“任務(wù)中,請勿打擾”,所以就有了鎖的這個概念,表示現(xiàn)在忙,暫時不能進行訪問。
異步回調(diào)
我們傳統(tǒng)的過程式程序可能就跟比較古板的小組1一樣,到期咱就切換任務(wù)嗎。他們覺得這種方式還是不能把工作效率提高到最高。他們開會就討論怎么能提高這個效率呢,有個外號蟒蛇的就說呀,他覺得有時候等PCB的測試板實在是比較耗時間,有時候一兩天啥事沒有,就是干等著板子打出來做測試,這期間也不知道干啥。不過最近有個朋友告訴我一個比較好的工作方法,先做好任務(wù)的規(guī)劃,把哪些可以同時做的事情列出來,以后就按照這個表來做,有空閑就去做其他的事情,等前面做的東西可以繼續(xù)了,就繼續(xù)回頭做前面的事情。
他們新來外號面條的就說,你們連這個都不懂啊,我一直都是這么干的。
前面蟒蛇提到的問題就是平時經(jīng)常碰到的阻塞,比如磁盤IO,網(wǎng)絡(luò)IO這些比較耗時間的操作。他那個朋友(Gevent)教的方法就是異步。
異步回調(diào),就是遇到阻塞時,就去做其他的事情(新的線程),當(dāng)之前的產(chǎn)生結(jié)果了就把那個結(jié)果拿回來處理,但是這不是在你原來的形成規(guī)劃中。
對于上面的例子,蟒蛇可能就對PCB生產(chǎn)線上的人說,他就不在這守著了,做好給個電話,他自己去取就好了,或者陪人送到他辦公室。這就是異步的通訊與回調(diào)機制,打電話通知他就是告訴他完成的這個消息,他在過來取走;而寄到他辦公室,就是直接把執(zhí)行的結(jié)果返回到預(yù)定的地方,他會每天都檢查一下是否有結(jié)果了。
并發(fā)
開始說說重點,并發(fā)了。記得有個“七天七”系列的書,當(dāng)然這和國內(nèi)“X天”系列不一樣,這個系列本本算得好書,其中就有一本是《七天七并發(fā)》,可惜當(dāng)時在圖書館找到時,我快畢業(yè)了。
有不少編程語言實在語言級別實現(xiàn)的并發(fā),例如,Erlang、Haskell、Scala、Clojure,以及比較年輕的Golang。相信這些都聽過,我個人是真的沒有去仔細研究過,借這次機會好好看看。
并發(fā)模型
- Communicating Sequential Processes
- Actor