1. 徹底搞懂channel原理(二)

        共 1526字,需瀏覽 4分鐘

         ·

        2021-11-04 17:29

        上一篇文章主要介紹channel運(yùn)行時(shí)是通過(guò)hchan表示的,也簡(jiǎn)單說(shuō)明了hchan各個(gè)字段的含義。

        我們提到,對(duì)channel的操作,本質(zhì)上就是對(duì)hchan里字段的操作。因?yàn)樵诓僮鞯倪^(guò)程中使用了互斥鎖,所以保證了channel的并發(fā)安全。

        這篇文章主要通過(guò)現(xiàn)實(shí)生活的一些例子來(lái)說(shuō)明channel的一些原理,當(dāng)然還是不會(huì)涉及過(guò)多源碼。


        無(wú)緩沖

        我們都知道,channel分為無(wú)緩沖和緩沖。這兩者最大的區(qū)別是什么?

        我們用一個(gè)現(xiàn)實(shí)生活的快遞例子來(lái)說(shuō)明。

        上面場(chǎng)景是快遞員在等小庫(kù),當(dāng)然反過(guò)來(lái)小庫(kù)也可能在等快遞員。


        如果沒(méi)有快遞柜,快遞員在送快遞的過(guò)程中,如果家里沒(méi)人,他就得在那等著,等著有人來(lái)簽收快遞,他才送貨結(jié)束。

        客戶(hù)在快遞員到來(lái)之前,他也不能離開(kāi)家,不然快遞來(lái)了沒(méi)人收,所以他也得等到快遞員上門(mén),簽字收了快遞,他才算收貨結(jié)束。


        當(dāng)然,客戶(hù)不止有這家快遞,如果快遞員A在等的時(shí)候又來(lái)一個(gè)快遞員B給他送貨。這個(gè)快遞員B不僅得等著,還得排隊(duì)。等到客戶(hù)到家后,肯定是先簽收A的快遞,然后再簽收B的快遞。

        對(duì)應(yīng)到無(wú)緩沖channel,

        發(fā)送數(shù)據(jù)的時(shí)候,如果沒(méi)有對(duì)應(yīng)的接收者ready,那么發(fā)送者就進(jìn)入到等待發(fā)送隊(duì)列中,等待有對(duì)應(yīng)的接收者喚醒它。

        接收數(shù)據(jù)的時(shí)候,如果沒(méi)有對(duì)應(yīng)的發(fā)送者ready,那么接收者就進(jìn)入到等待接收隊(duì)列中,等待有對(duì)應(yīng)的發(fā)送者喚醒它。

        還記得上一篇文章我們介紹過(guò)hchan的結(jié)構(gòu)嗎


        其中recvq表示等待接收消息的隊(duì)列,sendq表示等待發(fā)送消息的隊(duì)列

        我們來(lái)看waitq。

        本質(zhì)上waitq就是一個(gè)鏈表,更確切的說(shuō)是一個(gè)雙向循環(huán)的鏈表。其中waitq記錄了鏈表的頭尾,sudog記錄了當(dāng)前等待者的上一個(gè)等待者(prev)和下一個(gè)等待者(next)。

        這就好像小庫(kù)在簽收完A的快遞后喊,下一個(gè)是誰(shuí)???

        A會(huì)說(shuō):我的下一個(gè)是B。

        B會(huì)說(shuō):是我。我記得我上一個(gè)是A,目前我沒(méi)有下一個(gè),所以我是最后一個(gè)。


        緩沖

        看完了無(wú)緩沖隊(duì)列,我們?cè)賮?lái)看緩沖隊(duì)列。還是用上面的故事,

        只要快遞柜有空閑柜子,快遞員就可以直接把快遞放到柜子里,讓客戶(hù)自己去柜子拿。如果發(fā)送沒(méi)有空閑的柜子,那就只能等,等到別人告訴我有空閑柜子,我再把快遞放到空出來(lái)的柜子里。

        對(duì)應(yīng)到緩沖channel,上面的快遞柜,就是緩沖channel中存儲(chǔ)數(shù)據(jù)的buffer。

        對(duì)于發(fā)送者來(lái)說(shuō):只要緩沖區(qū)未滿(mǎn),發(fā)送者就可以繼續(xù)發(fā)送數(shù)據(jù)存放在緩沖區(qū)。一旦緩沖區(qū)滿(mǎn)了,發(fā)送者就只能進(jìn)入到等待發(fā)送隊(duì)列中,等待有對(duì)應(yīng)的接收者喚醒它,然后它再把數(shù)據(jù)放入到剛剛被取走數(shù)據(jù)的位置。


        對(duì)于接收者來(lái)說(shuō):只要緩沖區(qū)不為空,接收者就可以繼續(xù)接收數(shù)據(jù)。一旦緩沖區(qū)空了,那么接收者就只能進(jìn)入到等待接收隊(duì)列中,等待有對(duì)應(yīng)的發(fā)送者喚醒它。


        上面還有什么問(wèn)題嗎?還真有。


        我們?nèi)】爝f的時(shí)候,你一定會(huì)按照快遞放入到快遞柜的先后順序取快遞嗎?咋么可能。

        但是在channel中,是會(huì)保證消息的先進(jìn)先出(FIFO)關(guān)系的。至于咋么保證的,我們終結(jié)篇解析代碼細(xì)節(jié)的時(shí)候再說(shuō)。


        總結(jié)

        這篇文章主要通過(guò)一個(gè)快遞的例子來(lái)介紹channel操作的原理。下一篇我們介channel針對(duì)上述處理的細(xì)節(jié)邏輯。



        推薦閱讀


        福利

        我為大家整理了一份從入門(mén)到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門(mén)看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。

        瀏覽 65
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 男男情趣玩具play高h | 一本一道加勒比 | 麻豆爱爱视频 | 亚洲性爱无码 | 欧美大屌视频 |