电竞比分网-中国电竞赛事及体育赛事平台

分享

關于協(xié)程

 liang1234_ 2019-01-31
1. 關于協(xié)程,究竟有什么用?
一個例子,微信在當用戶量達到1億級別時候,在重構后臺,有兩種方式:
a. 線程式異步改造;
b. 協(xié)程式異步改造

第一種方案無異于大量徹底重構,而第二種可以改少量得代碼即可實現(xiàn),同步轉異步。
對于微信這樣量級這么大的系統(tǒng),同時后臺也是極其復雜,最后微信選擇了第二種,所以這里說協(xié)程,究竟有什么用? 同步改異步,或者說用同步的方式實現(xiàn)異步。

2. 對于協(xié)程比線程有什么好處?
協(xié)程可以說是“線程的線程”,也就是他不像線程切換時需要上下文切換;
協(xié)程就是在一個線程中最大化利用cpu,因為當遇到io阻塞或jdbc阻塞時候,其實cpu是空閑的,一直在等待io返回,這也是為什么總說數(shù)據(jù)庫是瓶頸的原因,而這個時候,協(xié)程就是可以讓cpu在此時繼續(xù)去做運算,而這正是比線程好的地方。

3. 關于協(xié)程,你可能看的最多的就是這樣一句話“協(xié)程就是用戶態(tài)的線程”.
要理解是什么是“用戶態(tài)的線程”,必然就要先理解什么是“內(nèi)核態(tài)的線程”。 內(nèi)核態(tài)的線程是由操作系統(tǒng)來進行調度的,在切換線程上下文時,要先保存上一個線程的上下文,然后執(zhí)行下一個線程,當條件滿足時,切換回上一個線程,并恢復上下文。 協(xié)程也是如此,只不過,用戶態(tài)的線程不是由操作系統(tǒng)來調度的,而是由程序員來調度的,是在用戶態(tài)的。
yield這個關鍵字就是用來產(chǎn)生中斷, 并保存當前的上下文的, 比如說程序的一段代碼是訪問遠程服務器,那這個時候CPU就是空閑的,就用yield讓出CPU,接著執(zhí)行下一段的代碼,如果下一段代碼還是訪問除CPU以外的其它資源,還可以調用yield讓出CPU. 繼續(xù)往下執(zhí)行,這樣就可以用同步的方式寫異步的代碼了.


4. 一開始大家想要同一時間執(zhí)行那么三五個程序,大家能一塊跑一跑。特別是UI什么的,別一上計算量比較大的玩意就跟死機一樣。于是就有了并發(fā),從程序員的角度可以看成是多個獨立的邏輯流。內(nèi)部可以是多cpu并行,也可以是單cpu時間分片,能快速的切換邏輯流,看起來像是大家一塊跑的就行。

但是一塊跑就有問題了。我計算到一半,剛把多次方程解到最后一步,你突然插進來,我的中間狀態(tài)咋辦,我用來儲存的內(nèi)存被你覆蓋了咋辦?所以跑在一個cpu里面的并發(fā)都需要處理上下文切換的問題。進程就是這樣抽象出來個一個概念,搭配虛擬內(nèi)存、進程表之類的東西,用來管理獨立的程序運行、切換。

后來一電腦上有了好幾個cpu,好咧,大家都別閑著,一人跑一進程。就是所謂的并行。

因為程序的使用涉及大量的計算機資源配置,把這活隨意的交給用戶程序,非常容易讓整個系統(tǒng)分分鐘被搞跪,資源分配也很難做到相對的公平。所以核心的操作需要陷入內(nèi)核(kernel),切換到操作系統(tǒng),讓老大幫你來做。

有的時候碰著I/O訪問,阻塞了后面所有的計算??罩彩强罩洗缶椭苯影袰PU切換到其他進程,讓人家先用著。當然除了I\O阻塞,還有時鐘阻塞等等。一開始大家都這樣弄,后來發(fā)現(xiàn)不成,太慢了。為啥呀,一切換進程得反復進入內(nèi)核,置換掉一大堆狀態(tài)。進程數(shù)一高,大部分系統(tǒng)資源就被進程切換給吃掉了。后來搞出線程的概念,大致意思就是,這個地方阻塞了,但我還有其他地方的邏輯流可以計算,這些邏輯流是共享一個地址空間的,不用特別麻煩的切換頁表、刷新TLB,只要把寄存器刷新一遍就行,能比切換進程開銷少點。

如果連時鐘阻塞、 線程切換這些功能我們都不需要了,自己在進程里面寫一個邏輯流調度的東西。那么我們即可以利用到并發(fā)優(yōu)勢,又可以避免反復系統(tǒng)調用,還有進程切換造成的開銷,分分鐘給你上幾千個邏輯流不費力。這就是用戶態(tài)線程。

從上面可以看到,實現(xiàn)一個用戶態(tài)線程有兩個必須要處理的問題:一是碰著阻塞式I\O會導致整個進程被掛起;二是由于缺乏時鐘阻塞,進程需要自己擁有調度線程的能力。如果一種實現(xiàn)使得每個線程需要自己通過調用某個方法,主動交出控制權。那么我們就稱這種用戶態(tài)線程是協(xié)作式的,即是協(xié)程。

本質上協(xié)程就是用戶空間下的線程。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多