• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰(shuí)的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            同步/異步與阻塞/非阻塞的區(qū)別

            我喜歡用自己的語(yǔ)言通過(guò)聯(lián)系現(xiàn)實(shí)生活中的一些現(xiàn)象解釋一些概念,當(dāng)我能做到這一點(diǎn)時(shí),說(shuō)明我已經(jīng)理解了這個(gè)概念.今天要解釋的概念是:同步/異步與阻塞/非阻塞的區(qū)別.

            這兩組概念常常讓人迷惑,因?yàn)樗鼈兌际巧婕暗絀O處理,同時(shí)又有著一些相類(lèi)似的地方.

            首先來(lái)解釋同步和異步的概念,這兩個(gè)概念與消息的通知機(jī)制有關(guān).

            舉個(gè)例子,比如我去銀行辦理業(yè)務(wù),可能選擇排隊(duì)等候,也可能取一個(gè)小紙條上面有我的號(hào)碼,等到排到我這一號(hào)時(shí)由柜臺(tái)的人通知我輪到我去辦理業(yè)務(wù)了.
            前者(排隊(duì)等候)就是同步等待消息,而后者(等待別人通知)就是異步等待消息.在異步消息處理中,等待消息者(在這個(gè)例子中就是等待辦理業(yè)務(wù)的人)往往注冊(cè)一個(gè)回調(diào)機(jī)制,在所等待的事件被觸發(fā)時(shí)由觸發(fā)機(jī)制(在這里是柜臺(tái)的人)通過(guò)某種機(jī)制(在這里是寫(xiě)在小紙條上的號(hào)碼)找到等待該事件的人.
            而在實(shí)際的程序中,同步消息處理就好比簡(jiǎn)單的read/write操作,它們需要等待這兩個(gè)操作成功才能返回;而異步處理機(jī)制就是類(lèi)似于select/poll之類(lèi)的多路復(fù)用IO操作,當(dāng)所關(guān)注的消息被觸發(fā)時(shí),由消息觸發(fā)機(jī)制通知觸發(fā)對(duì)消息的處理.

            其次再來(lái)解釋一下阻塞和非阻塞,這兩個(gè)概念與程序等待消息(無(wú)所謂同步或者異步)時(shí)的狀態(tài)有關(guān).
            繼續(xù)上面的那個(gè)例子,不論是排隊(duì)還是使用號(hào)碼等待通知,如果在這個(gè)等待的過(guò)程中,等待者除了等待消息之外不能做其它的事情,那么該機(jī)制就是阻塞的,表現(xiàn)在程序中,也就是該程序一直阻塞在該函數(shù)調(diào)用處不能繼續(xù)往下執(zhí)行.相反,有的人喜歡在銀行辦理這些業(yè)務(wù)的時(shí)候一邊打打電話(huà)發(fā)發(fā)短信一邊等待,這樣的狀態(tài)就是非阻塞的,因?yàn)樗?等待者)沒(méi)有阻塞在這個(gè)消息通知上,而是一邊做自己的事情一邊等待.但是需要注意了,第一種同步非阻塞形式實(shí)際上是效率低下的,想象一下你一邊打著電話(huà)一邊還需要抬頭看到底隊(duì)伍排到你了沒(méi)有,如果把打電話(huà)和觀察排隊(duì)的位置看成是程序的兩個(gè)操作的話(huà),這個(gè)程序需要在這兩種不同的行為之間來(lái)回的切換,效率可想而知是低下的;而后者,異步非阻塞形式卻沒(méi)有這樣的問(wèn)題,因?yàn)榇螂娫?huà)是你(等待者)的事情,而通知你則是柜臺(tái)(消息觸發(fā)機(jī)制)的事情,程序沒(méi)有在兩種不同的操作中來(lái)回切換.

            很多人會(huì)把同步和阻塞混淆,我想是因?yàn)楹芏鄷r(shí)候同步操作會(huì)以阻塞的形式表現(xiàn)出來(lái),比如很多人會(huì)寫(xiě)阻塞的read/write操作,但是別忘了可以對(duì)fd設(shè)置O_NONBLOCK標(biāo)志位,這樣就可以將同步操作變成非阻塞的了;同樣的,很多人也會(huì)把異步和非阻塞混淆,因?yàn)楫惒讲僮饕话愣疾粫?huì)在真正的IO操作處被阻塞,比如如果用select函數(shù),當(dāng)select返回可讀時(shí)再去read一般都不會(huì)被阻塞,就好比當(dāng)你的號(hào)碼排到時(shí)一般都是在你之前已經(jīng)沒(méi)有人了,所以你再去柜臺(tái)辦理業(yè)務(wù)就不會(huì)被阻塞.

            可見(jiàn),同步/異步與阻塞/非阻塞是兩組不同的概念,它們可以共存組合,也可以參見(jiàn)這里:
            http://www.ibm.com/developerworks/cn/linux/l-async/

            ----------------------------------------- 分割線 ------------------------------------------------------
            昨晚寫(xiě)完這篇文章之后,今早來(lái)看了看反饋,同時(shí)再自己閱讀了幾遍,發(fā)現(xiàn)還是有一些地方解釋的不夠清楚,在這里繼續(xù)補(bǔ)充完善一下我的說(shuō)法,但愿沒(méi)有越說(shuō)越糊涂.

            同步和異步:上面提到過(guò),同步和異步僅僅是關(guān)于所關(guān)注的消息如何通知的機(jī)制,而不是處理消息的機(jī)制.也就是說(shuō),同步的情況下,是由處理消息者自己去等待消息是否被觸發(fā),而異步的情況下是由觸發(fā)機(jī)制來(lái)通知處理消息者,所以在異步機(jī)制中,處理消息者和觸發(fā)機(jī)制之間就需要一個(gè)連接的橋梁,在我們舉的例子中這個(gè)橋梁就是小紙條上面的號(hào)碼,而在select/poll等IO多路復(fù)用機(jī)制中就是fd,當(dāng)消息被觸發(fā)時(shí),觸發(fā)機(jī)制通過(guò)fd找到處理該fd的處理函數(shù).

            請(qǐng)注意理解消息通知和處理消息這兩個(gè)概念,這是理解這個(gè)問(wèn)題的關(guān)鍵所在.還是回到上面的例子,輪到你辦理業(yè)務(wù)這個(gè)就是你關(guān)注的消息,而去辦理業(yè)務(wù)就是對(duì)這個(gè)消息的處理,兩者是有區(qū)別的.而在真實(shí)的IO操作時(shí),所關(guān)注的消息就是該fd是否可讀寫(xiě),而對(duì)消息的處理就是對(duì)這個(gè)fd進(jìn)行讀寫(xiě).同步/異步僅僅關(guān)注的是如何通知消息,它們對(duì)如何處理消息并不關(guān)心,好比說(shuō),銀行的人僅僅通知你輪到你辦理業(yè)務(wù)了,而如何辦理業(yè)務(wù)他們是不知道的.

            而很多人之所以把同步和阻塞混淆,我想也是因?yàn)闆](méi)有區(qū)分這兩個(gè)概念,比如阻塞的read/write操作中,其實(shí)是把消息通知和處理消息結(jié)合在了一起,在這里所關(guān)注的消息就是fd是否可讀/寫(xiě),而處理消息則是對(duì)fd讀/寫(xiě).當(dāng)我們將這個(gè)fd設(shè)置為非阻塞的時(shí)候,read/write操作就不會(huì)在等待消息通知這里阻塞,如果fd不可讀/寫(xiě)則操作立即返回.

            很多人又會(huì)問(wèn)了,異步操作不會(huì)是阻塞的吧?已經(jīng)通知了有消息可以處理了就一定不是阻塞的了吧?
            其實(shí)異步操作是可以被阻塞住的,只不過(guò)通常不是在處理消息時(shí)阻塞,而是在等待消息被觸發(fā)時(shí)被阻塞.比如select函數(shù),假如傳入的最后一個(gè)timeout參數(shù)為NULL,那么如果所關(guān)注的事件沒(méi)有一個(gè)被觸發(fā),程序就會(huì)一直阻塞在這個(gè)select調(diào)用處.而如果使用異步非阻塞的情況,比如aio_*組的操作,當(dāng)我發(fā)起一個(gè)aio_read操作時(shí),函數(shù)會(huì)馬上返回不會(huì)被阻塞,當(dāng)所關(guān)注的事件被觸發(fā)時(shí)會(huì)調(diào)用之前注冊(cè)的回調(diào)函數(shù)進(jìn)行處理,具體可以參見(jiàn)我上面的連接給出的那篇文章.回到上面的例子中,如果在銀行等待辦理業(yè)務(wù)的人采用的是異步的方式去等待消息被觸發(fā),也就是領(lǐng)了一張小紙條,假如在這段時(shí)間里他不能離開(kāi)銀行做其它的事情,那么很顯然,這個(gè)人被阻塞在了這個(gè)等待的操作上面;但是呢,這個(gè)人突然發(fā)覺(jué)自己煙癮犯了,需要出去抽根煙,于是他告訴大堂經(jīng)理說(shuō),排到我這個(gè)號(hào)碼的時(shí)候麻煩到外面通知我一下(注冊(cè)一個(gè)回調(diào)函數(shù)),那么他就沒(méi)有被阻塞在這個(gè)等待的操作上面,自然這個(gè)就是異步+非阻塞的方式了.




            posted on 2009-05-13 22:11 那誰(shuí) 閱讀(53091) 評(píng)論(42)  編輯 收藏 引用 所屬分類(lèi): 網(wǎng)絡(luò)編程服務(wù)器設(shè)計(jì)Linux/Unix

            評(píng)論

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            bu cuo
            2009-05-13 22:59 | tiny

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            我這個(gè)笨還是想不通

            排列等待是等待,也是等別人通知你呀,站在你前面那個(gè)人的事辦完了,還不是就通知到你了。

            而那個(gè)小紙條是通知,也還是等待啊,還不是等一個(gè)個(gè)人處理完,最后你前一個(gè)處理,就輪到你了。

            不是一樣啊?沒(méi)什么分別呀。只不過(guò)人排列的順序變成了號(hào)碼排列的順序。
            2009-05-13 23:42 | ttplay

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @ttplay
            我的理解是:
            同步的時(shí)候,不是站在你前面的人通知你,是你自己得看著你前面還有沒(méi)有人。
            而小紙條就不一樣了,你拿了紙條就不用管了,出去溜達(dá)都可以,反正到時(shí)候有人會(huì)叫你。
            2009-05-14 09:12 | Sunshine Alike

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            我覺(jué)得IO復(fù)用select/epoll那個(gè)應(yīng)該不算異步吧,異步(AIO)是指read/write完成后操作系統(tǒng)會(huì)回調(diào)用戶(hù)空間的指定回調(diào)方法,而select/epoll只是一個(gè)有事件就緒的通知,沒(méi)有這個(gè)回調(diào)過(guò)程,需要你自己主動(dòng)調(diào)用read/write
            2009-05-14 09:33 | bachmozart

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            類(lèi)比很恰當(dāng),確實(shí)讓我又清晰了不少。
            好文,作者好人。
            2009-05-14 11:31 | abettor

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @ttplay
            排隊(duì)等待是處理消息者自己等待,取小紙條是由別人通知你.
            2009-05-14 13:09 | 那誰(shuí)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            我的理解:

            同步: '你'親自辦這件事
            異步: 交代要做的事情,然后忙其他的事情;'別人'(內(nèi)核)會(huì)充當(dāng)你的跑腿,在條件就緒后將這事辦成,然后通知你(callback);

            阻塞: 如果條件未就緒,'你'必須死等它就緒;進(jìn)程睡眠
            非阻塞:如果條件未就緒,'你'可以轉(zhuǎn)身作別的事情;進(jìn)程可以作任何想做的事情,不過(guò)通常是低效的輪詢(xún)。

            以這種理解方式,阻塞/非阻塞只對(duì)同步操作有意義;異步I/O總是意味著進(jìn)程不會(huì)因?yàn)镮/O陷入睡眠。

            將" select"歸類(lèi)為異步+blocking不妥,select實(shí)際上完成的只是read/write的第一部分:等待條件就緒;唯一的改進(jìn)是可以等待多個(gè)條件。"select + read/write"的調(diào)用形式容易產(chǎn)生"系統(tǒng)通知我條件就緒"的假象,可實(shí)際上你不過(guò)是在條件就緒的時(shí)候醒來(lái),然后仍然親自動(dòng)手完成了數(shù)據(jù)復(fù)制的操作。

            依然使用銀行的隱喻:

            柜臺(tái)R:只能取款
            柜臺(tái)W:只能存款

            read: 親自在柜臺(tái)R排隊(duì)(進(jìn)程睡眠) + 取款
            write: 親自在柜臺(tái)W排隊(duì)(進(jìn)程睡眠) + 存款

            select + read/write : 親自同時(shí)在R、W兩個(gè)柜臺(tái)排隊(duì)(進(jìn)程睡眠) + (存款|取款|存款+取款)

            AIO : 告訴心腹小弟要取款若干,然后忙別的事情;小弟取款完畢將其如數(shù)奉上。

            UNP一書(shū)中6.2節(jié)對(duì)I/O模型的分類(lèi)我覺(jué)得很合理:

            1).read/write、read + NON_BLOCK、select、signal driven I/O 都屬于同步I/O; 它們的共同特點(diǎn)是:將數(shù)據(jù)從內(nèi)核空間復(fù)制到到用戶(hù)空間的這個(gè)操作,是由用戶(hù)空間的代碼顯式發(fā)起的。

            2).只有AIO 屬于 異步I/O;內(nèi)核不露聲色的將數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶(hù)空間,然后通知進(jìn)程。










            2009-05-14 23:02 | 嘯天豬

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @嘯天豬
            我看了一下你的評(píng)論,我想我們之間觀點(diǎn)最大的分歧點(diǎn)在于:

            我的觀點(diǎn)是同步/異步僅是消息通知的機(jī)制,至于消息到來(lái)時(shí)如何處理與這兩個(gè)概念無(wú)關(guān).

            而你的觀點(diǎn)則認(rèn)為,同步/異步不僅僅包括消息通知,還包括了對(duì)消息的處理,所以select之類(lèi)的通知消息的觸發(fā)機(jī)制你歸類(lèi)為"同步",而AIO這種俘獲了消息也對(duì)消息進(jìn)行了處理(比如你說(shuō)的將數(shù)據(jù)從內(nèi)核copy到用戶(hù)態(tài))的機(jī)制才是真正的異步.

            也就是說(shuō),你上面回復(fù)的這句話(huà):
            異步: 交代要做的事情,然后忙其他的事情;'別人'(內(nèi)核)會(huì)充當(dāng)你的跑腿,在條件就緒后將這事辦成,然后通知你(callback);

            事實(shí)上是我們之間對(duì)這個(gè)概念認(rèn)知的最大分歧,你認(rèn)為異步就是不止通知了消息,還要加上將這件事情辦妥.而我認(rèn)為,異步僅在于通知這個(gè)消息發(fā)生了,而具體如何處理該消息不在它關(guān)注的范圍之內(nèi).

            我在寫(xiě)上上面這段評(píng)論的時(shí)候也在思考對(duì)這個(gè)概念的理解,我還是認(rèn)為我的觀點(diǎn)是正確的,今天太晚了,改天找來(lái)UNP詳細(xì)看看.
            2009-05-14 23:54 | 那誰(shuí)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            概念真要理解了,就是一句話(huà)可以說(shuō)透的。
            2009-05-15 23:05 | Benjamin

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @ttplay
            在你下面的回復(fù)我沒(méi)看
            我理解的是
            拿紙條和 排隊(duì)的區(qū)別在于
            排隊(duì)的 必須自己 一直看前面是否有人 沒(méi)人就是到自己了
            拿紙條的就可以這樣理解
            坐在那里愛(ài) 干嘛干嘛 等輪到他時(shí) 柜臺(tái)就給他發(fā)個(gè)消息 他收到消息就去...
            他不用象排隊(duì)的一樣
            不斷檢測(cè) 前面是否有人
            2009-08-10 00:19 | 王清

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            同步異步是,一段時(shí)間里能不能做多件事情,不能,同步;能,異步。
            阻塞非阻塞是,自己等待的那個(gè)步驟需要不需要自己去確認(rèn),需要?jiǎng)t是阻塞,不需要?jiǎng)t是非阻塞
            2009-11-20 14:03 | wgcno7

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            @嘯天豬

            大哥,你太牛逼了!!
            2009-11-27 13:18 | Squall

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            博主講得好啊!~!
            2010-01-06 09:17 | Pigsy.Beard

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            @那誰(shuí)
            select 是同步非阻塞的
            2010-10-28 14:38 | 菜鳥(niǎo)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            這些都和消息機(jī)制基本無(wú)關(guān)
            同步異步是就操作發(fā)起者是否實(shí)際執(zhí)行者而言的,是自己親自去銀行取錢(qián)還是讓小弟幫忙解決

            只有異步時(shí)才有消息的問(wèn)題,小弟干完活會(huì)向你匯報(bào),同步時(shí)你自給自己發(fā)消息啊?

            阻塞與非阻塞與消息觸發(fā)也沒(méi)啥關(guān)系,阻塞就是不管銀行排多長(zhǎng)隊(duì)等待直到取出錢(qián),非阻塞則是發(fā)現(xiàn)人多可以選擇不取或不在這兒取(拜托不同于發(fā)短信打電話(huà)。。。。。不能亂寫(xiě)無(wú)用代碼)。

            select/poll之類(lèi)也和所謂消息機(jī)制無(wú)關(guān),要到很多銀行分別取一些錢(qián),發(fā)現(xiàn)哪家銀行人少就去哪家,這顯然是同步的,只是需要做很多事情而不是一件。


            2010-11-08 00:01 | yangtou

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            靠,純粹是誤人子弟
            select/poll是同步的,你竟然拿來(lái)三番五次的作為異步的例子來(lái)講
            select/poll機(jī)制本來(lái)就叫多路復(fù)用I/O,或者多路同步I/O
            2010-12-02 14:57 | z_berry

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            同意@嘯天豬的,select是同步阻塞的
            2010-12-10 13:50 | unp

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            那誰(shuí),頂你!寫(xiě)的真不錯(cuò)!
            2011-02-24 15:42 | rainfish

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            本來(lái)還比較清晰,讓這位兄弟這么一說(shuō)更混了,好像異步和多路I/O復(fù)用差的很遠(yuǎn)吧,扯不上什么關(guān)系吧!
            2011-03-04 22:44 | aa

            # 請(qǐng)教大家一個(gè)網(wǎng)絡(luò)客戶(hù)端設(shè)計(jì)問(wèn)題  回復(fù)  更多評(píng)論   

            我寫(xiě)一個(gè)網(wǎng)絡(luò)客戶(hù)端sdk,我用的是select多路復(fù)用的方式,每一個(gè)socket我用一個(gè)類(lèi)封裝起來(lái),用戶(hù)發(fā)送一個(gè)消息就直接調(diào)用send發(fā)出去,然后數(shù)據(jù)接收到的時(shí)候會(huì)調(diào)用我類(lèi)里面的OnRecvData()函數(shù)表示數(shù)據(jù)接收過(guò)來(lái)了,
            但是我的程序的使用者要求要在發(fā)送消息后同步獲取返回的數(shù)據(jù),這時(shí)候最簡(jiǎn)單的辦法是設(shè)置一個(gè)變量,然后輪訓(xùn)的查消息是否從服務(wù)器反饋回來(lái)了,但是這樣這樣肯定是弱智的,
            那么如何給客戶(hù)提供的接口是同步的呢,以下是代碼的描述:


            我的網(wǎng)絡(luò)程序的內(nèi)部//////////////////////////////////////////////////////////////

            //一個(gè)封裝socket的類(lèi),select函數(shù)返回后會(huì)根據(jù)不同的socket句柄調(diào)用相應(yīng)的類(lèi)的接收數(shù)據(jù)的函數(shù)
            class Client
            {
            void OnRecvRead()
            {
            recv //這里接收數(shù)據(jù)

            //然后這里根據(jù)得到的消息調(diào)用不通的消息處理函數(shù)
            switch()
            case OnData1Recv()
            case OnData2Recv()
            case OnData3Recv()
            }
            //消息1處理函數(shù)
            void OnData1Recv()
            {
            //接收到反饋數(shù)據(jù)1,處理數(shù)據(jù)1
            }
            void OnData2Recv()
            {
            //接收到反饋數(shù)據(jù)2,處理數(shù)據(jù)2
            }
            void OnData3Recv()
            {
            //接收到反饋數(shù)據(jù)3,處理數(shù)據(jù)3
            }

            SOCKET m_sock;
            }

            //驅(qū)動(dòng)select的線程
            void ThreadStartService()
            {
            添加多個(gè)client(ip,端口對(duì))到FD_SET結(jié)構(gòu)中
            發(fā)起非阻塞連接

            while(1)
            {
            1:select(....);//循環(huán)調(diào)用select等待某一個(gè)socket可以收消息。
            2: 當(dāng)?shù)却揭粋€(gè)可以讀數(shù)據(jù)的socket后,根據(jù)socket查找對(duì)應(yīng)的Client類(lèi),然后調(diào)用Client的函數(shù)OnRecvRead();
            OnRecvRead里面再分析協(xié)議,然后調(diào)用不同的函數(shù)。
            }
            }


            給客戶(hù)導(dǎo)出一些函數(shù)/////////////////////////////////////////////////////

            //啟動(dòng)驅(qū)動(dòng)select的線程
            export InitService()
            {
            StartThread(ThreadStartService);
            }

            export ProcessData1()
            {
            1:發(fā)數(shù)據(jù)1處理一個(gè)消息,
            2:(如何實(shí)現(xiàn)?)這里是關(guān)鍵:再這個(gè)函數(shù)中返回上面“反饋數(shù)據(jù)1”。
            }
            export ProcessData2()
            {
            1:發(fā)數(shù)據(jù)2處理一個(gè)消息,
            2:(如何實(shí)現(xiàn)?)這里是關(guān)鍵:再這個(gè)函數(shù)中返回上面“反饋數(shù)據(jù)2”。
            }
            export ProcessData3()
            {
            1:發(fā)數(shù)據(jù)3處理一個(gè)消息,
            2:(如何實(shí)現(xiàn)?)這里是關(guān)鍵:再這個(gè)函數(shù)中返回上面“反饋數(shù)據(jù)3”。
            }


            客戶(hù)使用我的庫(kù)是先調(diào)用InitService,初始化select驅(qū)動(dòng)線程。
            可能在任何線程中調(diào)用ProcessData1,ProcessData2,ProcessData3,這三個(gè)函數(shù)。問(wèn)題是我同步做的很不好。
            抱歉寫(xiě)的比較啰嗦,請(qǐng)高人指點(diǎn)!



            2011-03-08 02:12 | 張紀(jì)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            寫(xiě)的很好!
            2011-03-16 17:29 | haodafeng

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            我覺(jué)得可以簡(jiǎn)單一點(diǎn)理解

            1. 同步調(diào)用,就是這個(gè)調(diào)用結(jié)束我要知道結(jié)果,不管是成功還是失敗

            2. 異步調(diào)用,就是這個(gè)調(diào)用結(jié)束不需要知道結(jié)果,結(jié)果稍后通知我(回調(diào)通知)

            3. 阻塞,就是調(diào)用我,調(diào)用線程可能會(huì)本掛起

            4. 非阻塞,就是調(diào)用我,調(diào)用不會(huì)被掛起


            2011-03-25 13:03 | hansonl

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @hansonl ,精辟
            2011-03-29 18:16 | 1212

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @那誰(shuí)
            這篇文章,我同意嘯天豬的概念。
            同步異步我認(rèn)為不是描述消息如何通知,而是兩個(gè)動(dòng)作的處理方式:咱倆并行?還是串行?是順序?還是并發(fā)?如果單講IO這一步,就不存在同步異步的問(wèn)題。
            比如我們一般的硬盤(pán)是同步IO,在允許讀寫(xiě)時(shí),cpu要等讀寫(xiě)完成后,才能做下一件事情,就是串行;而某些SCSI卡自幾有CPU, 如果它肯幫你做讀寫(xiě)的話(huà),我們的CPU就可以不管讀寫(xiě)動(dòng)作是否完成,而直接去做下一件事情了。類(lèi)型豬說(shuō)的那個(gè)父親讓兒子干活的例子。
            2011-04-15 09:42 | 討論

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            阿斯頓撒
            2011-07-26 14:25 | 佛擋殺佛

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            高人帖,看帖得回帖呀!不錯(cuò),醍醐灌頂
            2011-09-01 10:47 | dotnetpig

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            UNP6.2節(jié),跟lz的理解有所不同的說(shuō)
            2011-10-21 09:53 | xiaok

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            樓主剛好說(shuō)反了,呵呵
            2012-03-03 13:09 | unixlover

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            樓主剛好寫(xiě)反了,呵呵
            2012-03-03 13:11 | unixlover

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            樓主的描述讓我學(xué)習(xí)到很多,但樓主的觀點(diǎn)我不能完全認(rèn)同。
            就拿樓主的銀行例子來(lái)說(shuō),

            我歸納一下個(gè)人的一些觀點(diǎn),有不當(dāng)之處希望指正。

            1.同步阻塞模式:
            a.通過(guò)排隊(duì)等待辦理業(yè)務(wù),等待過(guò)程不做任何其他事情,由等待者自己判斷是
            否輪到自己。
            2.同步非阻塞模式:
            a.通過(guò)排隊(duì)等待辦理業(yè)務(wù),等待過(guò)程中打電話(huà)、聽(tīng)音樂(lè)。
            b.通過(guò)取號(hào)方式等待辦理業(yè)務(wù),等待過(guò)程中打電話(huà)、聽(tīng)音樂(lè)。
            3.異步阻塞模式:
            a.通過(guò)排隊(duì)等待辦理業(yè)務(wù),在排隊(duì)的時(shí)候“創(chuàng)造”一個(gè)新的人出來(lái),讓這個(gè)人
            到一邊呆著,不做任何事情。
            b.通過(guò)取號(hào)方式等待辦理業(yè)務(wù),在等待的時(shí)候“創(chuàng)造”一個(gè)新的人出來(lái),讓這
            個(gè)人到一邊呆著,不做任何事情。
            (個(gè)人認(rèn)為:異步阻塞模式?jīng)]有任何意義)
            4.異步非阻塞模式:
            a.通過(guò)排隊(duì)等待辦理業(yè)務(wù),在排隊(duì)的時(shí)候“創(chuàng)造”一個(gè)新的人出來(lái),讓這個(gè)人
            到一邊打電話(huà)、聽(tīng)音樂(lè)。
            b.通過(guò)取號(hào)方式等待辦理業(yè)務(wù),在等待的時(shí)候“創(chuàng)造”一個(gè)新的人出來(lái),讓這
            個(gè)人到一邊打電話(huà)、聽(tīng)音樂(lè)。

            所以個(gè)人認(rèn)為:同步和異步的標(biāo)志是看是否有新的人被“創(chuàng)造”出來(lái)。
            而阻塞和非阻塞的標(biāo)志是當(dāng)同一個(gè)人在等待一個(gè)事件的時(shí)候,是
            否可以繼續(xù)做其他事情。
            2012-05-30 11:30 | QQ:458885028

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            1.同步異步,是相對(duì)于你的程序框架設(shè)計(jì)
            2.阻塞和非阻塞,相對(duì)于一些函數(shù),如recv或send等

            明顯是不同的概念,兩個(gè)不同的條件,不能混為一談
            2012-06-20 09:59 | QQ:343534594

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            樓主關(guān)于select的闡述有些問(wèn)題,也是與嘯天豬的分歧所在,但是其關(guān)于異步/同步,阻塞/非阻塞的觀點(diǎn)很易理解也解釋的很到位。
            select稱(chēng)為“多路復(fù)用i/o”,其并不提供將數(shù)據(jù)從用戶(hù)空間搬移到內(nèi)核空間,或從內(nèi)核空間搬移到用戶(hù)空間的核心功能,因此并不能將其簡(jiǎn)單的歸類(lèi)于異步io、或同步io!其要完成io功能,還需要調(diào)用者從此函數(shù)成功返回后,再調(diào)用read,write,因此可將select 和 此后還需調(diào)用的read/write看做一個(gè)io整體。若select返回正值,則表示此時(shí)有設(shè)備準(zhǔn)備好可以進(jìn)行io,此時(shí)進(jìn)行io,肯定不會(huì)發(fā)生阻塞,這時(shí)select+read/write,可整體看做一個(gè)同步io;至于阻塞還是非阻塞,主要要看select函數(shù)的等待時(shí)間值設(shè)定,若為null,則是阻塞式的;若為非null,則其為非阻塞的,因?yàn)槠洳⒉荒鼙WC能將數(shù)據(jù)成功寫(xiě)入用戶(hù)空間或內(nèi)核空間。select并未設(shè)置回調(diào)函數(shù),當(dāng)然不能認(rèn)為具備異步io功能。
            2012-09-26 09:58 | qq 326942298

            # re: 343534594   回復(fù)  更多評(píng)論   

            同意你的觀點(diǎn),但可否稍微詳細(xì)點(diǎn)?
            對(duì)于io而言,其可以分位同步io,異步io,但是這是屬于程序設(shè)計(jì)的范疇,包括一系列的函數(shù)調(diào)用,如select,poll,write,read等,并不能簡(jiǎn)單的將1個(gè)函數(shù)歸類(lèi)于是異步的還是同步的。
            而對(duì)于單個(gè)io函數(shù),則有阻塞、非阻塞之分。
            2012-09-26 10:18 | qq 326942298

            # re:嘯天豬  回復(fù)  更多評(píng)論   

            更深入的想,嘯天豬的觀點(diǎn)比較合理:
            異步同步不是針對(duì)單個(gè)函數(shù)而言的,是針對(duì)程序設(shè)計(jì)而言的。
            如果程序設(shè)計(jì)要求實(shí)現(xiàn)異步io,那樓主理解的異步僅僅是消息通知可以進(jìn)行io,之后就不管io成功與否就是錯(cuò)誤的了,與程序設(shè)計(jì)偏離了!
            2012-09-26 10:30 | qq 326942298

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @ttplay

            你的理解不對(duì)。
            假設(shè)有10個(gè)業(yè)務(wù)窗口,你在1窗口排隊(duì),那你只能在這慢慢等待輪到自已,這期間你還得慢慢的往前移動(dòng)(前面有人辦完了),還怕別人插隊(duì),注意力分散,效率低。
            而叫號(hào)等待就不一樣了,10窗口都有可能叫你,你的等待時(shí)間大大縮短,等待的時(shí)候還可以看看書(shū),玩玩游戲,效率高。
            2012-10-27 15:11 | 直言

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            同步和異步應(yīng)該關(guān)注的是兩個(gè)變化的量的對(duì)應(yīng)關(guān)系,在i/o通信中“兩個(gè)量”分別指什么?
            2013-03-15 20:03 | 長(zhǎng)風(fēng)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            表達(dá)的不是很清楚
            2013-04-10 18:27 | 阿飛

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            select是異步的,但是調(diào)用select并不會(huì)立刻返回,所以也是阻塞的。
            2014-01-15 10:46 | gkpeng

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            好文章!清晰了不少!
            2014-02-13 11:10 | jarvis

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            建議不要將句子打的太過(guò)長(zhǎng),看不完就忘了。
            2014-03-03 14:32 | 周紅

            # re: 同步/異步與阻塞/非阻塞的區(qū)別  回復(fù)  更多評(píng)論   

            @ttplay
            排隊(duì)你不能離開(kāi)隊(duì)伍啊,否則就會(huì)被要求重新排隊(duì)。而拿到號(hào)碼的話(huà),可以不用一直處于長(zhǎng)長(zhǎng)的隊(duì)伍當(dāng)中。就是區(qū)別了吧。就像我們?cè)谀骋痪W(wǎng)站上注冊(cè)時(shí),先填入帳號(hào),再填密碼,再點(diǎn)提交。如果是同步的話(huà),需提交后才知道帳號(hào)是否已被注冊(cè),若是異步的話(huà),填完帳號(hào)后就可以知道該帳號(hào)是否已被注冊(cè)了。
            2014-09-12 14:09 | 魏萬(wàn)標(biāo)

            # re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄](méi)  回復(fù)  更多評(píng)論   

            樓主觀點(diǎn)嚴(yán)重有誤,一看嘯天豬就是看過(guò)UNP.6.2的,不明白的都去看看UNP6.2章節(jié)吧,不要在這里模棱兩可了,書(shū)中講的很清楚,也非常好理解.看了馬上就懂!
            阻塞io/非阻塞io/多路復(fù)用io(select,poll,epoll)/信號(hào)驅(qū)動(dòng)io,最終都是要用戶(hù)進(jìn)程調(diào)用recv來(lái)阻塞讀取數(shù)據(jù)的(無(wú)論該過(guò)程有多么的短暫),所以都?xì)w屬于posix定義的sync io,async io與syncio的區(qū)別就在于用戶(hù)進(jìn)程不需要手動(dòng)調(diào)用recv,kernel就為把數(shù)據(jù)放到用戶(hù)緩沖區(qū)了,用戶(hù)進(jìn)程壓根不需要干什么事,這就是主要的區(qū)別!

            2015-03-10 16:18 | 笨小孩
            一极黄色视频久久网站| 久久精品无码av| 久久久久国产一级毛片高清版| 国产精品久久国产精麻豆99网站| 久久66热人妻偷产精品9| 久久久久国产一级毛片高清版| 久久久精品久久久久久| 国产精品99久久久精品无码| 国产美女久久久| 性做久久久久久久久| 粉嫩小泬无遮挡久久久久久| 国内精品久久久久久久亚洲| 精品久久久无码21p发布| 久久99国产精品二区不卡| 欧洲性大片xxxxx久久久| 亚洲av伊人久久综合密臀性色| 久久国产精品99久久久久久老狼| 久久伊人中文无码| 久久国产色AV免费看| 久久人人爽人人澡人人高潮AV | 亚洲&#228;v永久无码精品天堂久久| 思思久久好好热精品国产| 久久99精品国产99久久| 久久久久精品国产亚洲AV无码| 中文字幕亚洲综合久久2| 无码国内精品久久人妻| 欧美国产精品久久高清| 久久国产乱子伦精品免费强| 久久精品成人欧美大片| 久久久久久久久久免免费精品| 国产午夜福利精品久久2021| 久久人人青草97香蕉| 国产精品综合久久第一页| 久久婷婷五月综合国产尤物app| 久久综合九色欧美综合狠狠| 亚洲国产成人久久综合一| 久久无码人妻一区二区三区| 久久久久久久久久久久久久| 无码乱码观看精品久久| 国产精品永久久久久久久久久| 久久九九有精品国产23百花影院|