• <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>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            同步/異步與阻塞/非阻塞的區別

            我喜歡用自己的語言通過聯系現實生活中的一些現象解釋一些概念,當我能做到這一點時,說明我已經理解了這個概念.今天要解釋的概念是:同步/異步與阻塞/非阻塞的區別.

            這兩組概念常常讓人迷惑,因為它們都是涉及到IO處理,同時又有著一些相類似的地方.

            首先來解釋同步和異步的概念,這兩個概念與消息的通知機制有關.

            舉個例子,比如我去銀行辦理業務,可能選擇排隊等候,也可能取一個小紙條上面有我的號碼,等到排到我這一號時由柜臺的人通知我輪到我去辦理業務了.
            前者(排隊等候)就是同步等待消息,而后者(等待別人通知)就是異步等待消息.在異步消息處理中,等待消息者(在這個例子中就是等待辦理業務的人)往往注冊一個回調機制,在所等待的事件被觸發時由觸發機制(在這里是柜臺的人)通過某種機制(在這里是寫在小紙條上的號碼)找到等待該事件的人.
            而在實際的程序中,同步消息處理就好比簡單的read/write操作,它們需要等待這兩個操作成功才能返回;而異步處理機制就是類似于select/poll之類的多路復用IO操作,當所關注的消息被觸發時,由消息觸發機制通知觸發對消息的處理.

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

            很多人會把同步和阻塞混淆,我想是因為很多時候同步操作會以阻塞的形式表現出來,比如很多人會寫阻塞的read/write操作,但是別忘了可以對fd設置O_NONBLOCK標志位,這樣就可以將同步操作變成非阻塞的了;同樣的,很多人也會把異步和非阻塞混淆,因為異步操作一般都不會在真正的IO操作處被阻塞,比如如果用select函數,當select返回可讀時再去read一般都不會被阻塞,就好比當你的號碼排到時一般都是在你之前已經沒有人了,所以你再去柜臺辦理業務就不會被阻塞.

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

            ----------------------------------------- 分割線 ------------------------------------------------------
            昨晚寫完這篇文章之后,今早來看了看反饋,同時再自己閱讀了幾遍,發現還是有一些地方解釋的不夠清楚,在這里繼續補充完善一下我的說法,但愿沒有越說越糊涂.

            同步和異步:上面提到過,同步和異步僅僅是關于所關注的消息如何通知的機制,而不是處理消息的機制.也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者,所以在異步機制中,處理消息者和觸發機制之間就需要一個連接的橋梁,在我們舉的例子中這個橋梁就是小紙條上面的號碼,而在select/poll等IO多路復用機制中就是fd,當消息被觸發時,觸發機制通過fd找到處理該fd的處理函數.

            請注意理解消息通知和處理消息這兩個概念,這是理解這個問題的關鍵所在.還是回到上面的例子,輪到你辦理業務這個就是你關注的消息,而去辦理業務就是對這個消息的處理,兩者是有區別的.而在真實的IO操作時,所關注的消息就是該fd是否可讀寫,而對消息的處理就是對這個fd進行讀寫.同步/異步僅僅關注的是如何通知消息,它們對如何處理消息并不關心,好比說,銀行的人僅僅通知你輪到你辦理業務了,而如何辦理業務他們是不知道的.

            而很多人之所以把同步和阻塞混淆,我想也是因為沒有區分這兩個概念,比如阻塞的read/write操作中,其實是把消息通知和處理消息結合在了一起,在這里所關注的消息就是fd是否可讀/寫,而處理消息則是對fd讀/寫.當我們將這個fd設置為非阻塞的時候,read/write操作就不會在等待消息通知這里阻塞,如果fd不可讀/寫則操作立即返回.

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




            posted on 2009-05-13 22:11 那誰 閱讀(53088) 評論(42)  編輯 收藏 引用 所屬分類: 網絡編程服務器設計Linux/Unix

            評論

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            我這個笨還是想不通

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

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

            不是一樣啊?沒什么分別呀。只不過人排列的順序變成了號碼排列的順序。
            2009-05-13 23:42 | ttplay

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            我覺得IO復用select/epoll那個應該不算異步吧,異步(AIO)是指read/write完成后操作系統會回調用戶空間的指定回調方法,而select/epoll只是一個有事件就緒的通知,沒有這個回調過程,需要你自己主動調用read/write
            2009-05-14 09:33 | bachmozart

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            類比很恰當,確實讓我又清晰了不少。
            好文,作者好人。
            2009-05-14 11:31 | abettor

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            我的理解:

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

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

            以這種理解方式,阻塞/非阻塞只對同步操作有意義;異步I/O總是意味著進程不會因為I/O陷入睡眠。

            將" select"歸類為異步+blocking不妥,select實際上完成的只是read/write的第一部分:等待條件就緒;唯一的改進是可以等待多個條件。"select + read/write"的調用形式容易產生"系統通知我條件就緒"的假象,可實際上你不過是在條件就緒的時候醒來,然后仍然親自動手完成了數據復制的操作。

            依然使用銀行的隱喻:

            柜臺R:只能取款
            柜臺W:只能存款

            read: 親自在柜臺R排隊(進程睡眠) + 取款
            write: 親自在柜臺W排隊(進程睡眠) + 存款

            select + read/write : 親自同時在R、W兩個柜臺排隊(進程睡眠) + (存款|取款|存款+取款)

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

            UNP一書中6.2節對I/O模型的分類我覺得很合理:

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

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










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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            @嘯天豬
            我看了一下你的評論,我想我們之間觀點最大的分歧點在于:

            我的觀點是同步/異步僅是消息通知的機制,至于消息到來時如何處理與這兩個概念無關.

            而你的觀點則認為,同步/異步不僅僅包括消息通知,還包括了對消息的處理,所以select之類的通知消息的觸發機制你歸類為"同步",而AIO這種俘獲了消息也對消息進行了處理(比如你說的將數據從內核copy到用戶態)的機制才是真正的異步.

            也就是說,你上面回復的這句話:
            異步: 交代要做的事情,然后忙其他的事情;'別人'(內核)會充當你的跑腿,在條件就緒后將這事辦成,然后通知你(callback);

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

            我在寫上上面這段評論的時候也在思考對這個概念的理解,我還是認為我的觀點是正確的,今天太晚了,改天找來UNP詳細看看.
            2009-05-14 23:54 | 那誰

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            @ttplay
            在你下面的回復我沒看
            我理解的是
            拿紙條和 排隊的區別在于
            排隊的 必須自己 一直看前面是否有人 沒人就是到自己了
            拿紙條的就可以這樣理解
            坐在那里愛 干嘛干嘛 等輪到他時 柜臺就給他發個消息 他收到消息就去...
            他不用象排隊的一樣
            不斷檢測 前面是否有人
            2009-08-10 00:19 | 王清

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            同步異步是,一段時間里能不能做多件事情,不能,同步;能,異步。
            阻塞非阻塞是,自己等待的那個步驟需要不需要自己去確認,需要則是阻塞,不需要則是非阻塞
            2009-11-20 14:03 | wgcno7

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

            @嘯天豬

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

            @那誰
            select 是同步非阻塞的
            2010-10-28 14:38 | 菜鳥

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            這些都和消息機制基本無關
            同步異步是就操作發起者是否實際執行者而言的,是自己親自去銀行取錢還是讓小弟幫忙解決

            只有異步時才有消息的問題,小弟干完活會向你匯報,同步時你自給自己發消息啊?

            阻塞與非阻塞與消息觸發也沒啥關系,阻塞就是不管銀行排多長隊等待直到取出錢,非阻塞則是發現人多可以選擇不取或不在這兒取(拜托不同于發短信打電話。。。。。不能亂寫無用代碼)。

            select/poll之類也和所謂消息機制無關,要到很多銀行分別取一些錢,發現哪家銀行人少就去哪家,這顯然是同步的,只是需要做很多事情而不是一件。


            2010-11-08 00:01 | yangtou

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

            那誰,頂你!寫的真不錯!
            2011-02-24 15:42 | rainfish

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            本來還比較清晰,讓這位兄弟這么一說更混了,好像異步和多路I/O復用差的很遠吧,扯不上什么關系吧!
            2011-03-04 22:44 | aa

            # 請教大家一個網絡客戶端設計問題  回復  更多評論   

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


            我的網絡程序的內部//////////////////////////////////////////////////////////////

            //一個封裝socket的類,select函數返回后會根據不同的socket句柄調用相應的類的接收數據的函數
            class Client
            {
            void OnRecvRead()
            {
            recv //這里接收數據

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

            SOCKET m_sock;
            }

            //驅動select的線程
            void ThreadStartService()
            {
            添加多個client(ip,端口對)到FD_SET結構中
            發起非阻塞連接

            while(1)
            {
            1:select(....);//循環調用select等待某一個socket可以收消息。
            2: 當等待到一個可以讀數據的socket后,根據socket查找對應的Client類,然后調用Client的函數OnRecvRead();
            OnRecvRead里面再分析協議,然后調用不同的函數。
            }
            }


            給客戶導出一些函數/////////////////////////////////////////////////////

            //啟動驅動select的線程
            export InitService()
            {
            StartThread(ThreadStartService);
            }

            export ProcessData1()
            {
            1:發數據1處理一個消息,
            2:(如何實現?)這里是關鍵:再這個函數中返回上面“反饋數據1”。
            }
            export ProcessData2()
            {
            1:發數據2處理一個消息,
            2:(如何實現?)這里是關鍵:再這個函數中返回上面“反饋數據2”。
            }
            export ProcessData3()
            {
            1:發數據3處理一個消息,
            2:(如何實現?)這里是關鍵:再這個函數中返回上面“反饋數據3”。
            }


            客戶使用我的庫是先調用InitService,初始化select驅動線程。
            可能在任何線程中調用ProcessData1,ProcessData2,ProcessData3,這三個函數。問題是我同步做的很不好。
            抱歉寫的比較啰嗦,請高人指點!



            2011-03-08 02:12 | 張紀

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            寫的很好!
            2011-03-16 17:29 | haodafeng

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            我覺得可以簡單一點理解

            1. 同步調用,就是這個調用結束我要知道結果,不管是成功還是失敗

            2. 異步調用,就是這個調用結束不需要知道結果,結果稍后通知我(回調通知)

            3. 阻塞,就是調用我,調用線程可能會本掛起

            4. 非阻塞,就是調用我,調用不會被掛起


            2011-03-25 13:03 | hansonl

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            樓主的描述讓我學習到很多,但樓主的觀點我不能完全認同。
            就拿樓主的銀行例子來說,

            我歸納一下個人的一些觀點,有不當之處希望指正。

            1.同步阻塞模式:
            a.通過排隊等待辦理業務,等待過程不做任何其他事情,由等待者自己判斷是
            否輪到自己。
            2.同步非阻塞模式:
            a.通過排隊等待辦理業務,等待過程中打電話、聽音樂。
            b.通過取號方式等待辦理業務,等待過程中打電話、聽音樂。
            3.異步阻塞模式:
            a.通過排隊等待辦理業務,在排隊的時候“創造”一個新的人出來,讓這個人
            到一邊呆著,不做任何事情。
            b.通過取號方式等待辦理業務,在等待的時候“創造”一個新的人出來,讓這
            個人到一邊呆著,不做任何事情。
            (個人認為:異步阻塞模式沒有任何意義)
            4.異步非阻塞模式:
            a.通過排隊等待辦理業務,在排隊的時候“創造”一個新的人出來,讓這個人
            到一邊打電話、聽音樂。
            b.通過取號方式等待辦理業務,在等待的時候“創造”一個新的人出來,讓這
            個人到一邊打電話、聽音樂。

            所以個人認為:同步和異步的標志是看是否有新的人被“創造”出來。
            而阻塞和非阻塞的標志是當同一個人在等待一個事件的時候,是
            否可以繼續做其他事情。
            2012-05-30 11:30 | QQ:458885028

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            樓主關于select的闡述有些問題,也是與嘯天豬的分歧所在,但是其關于異步/同步,阻塞/非阻塞的觀點很易理解也解釋的很到位。
            select稱為“多路復用i/o”,其并不提供將數據從用戶空間搬移到內核空間,或從內核空間搬移到用戶空間的核心功能,因此并不能將其簡單的歸類于異步io、或同步io!其要完成io功能,還需要調用者從此函數成功返回后,再調用read,write,因此可將select 和 此后還需調用的read/write看做一個io整體。若select返回正值,則表示此時有設備準備好可以進行io,此時進行io,肯定不會發生阻塞,這時select+read/write,可整體看做一個同步io;至于阻塞還是非阻塞,主要要看select函數的等待時間值設定,若為null,則是阻塞式的;若為非null,則其為非阻塞的,因為其并不能保證能將數據成功寫入用戶空間或內核空間。select并未設置回調函數,當然不能認為具備異步io功能。
            2012-09-26 09:58 | qq 326942298

            # re: 343534594   回復  更多評論   

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

            # re:嘯天豬  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            @ttplay

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

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

            同步和異步應該關注的是兩個變化的量的對應關系,在i/o通信中“兩個量”分別指什么?
            2013-03-15 20:03 | 長風

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

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

            # re: 同步/異步與阻塞/非阻塞的區別  回復  更多評論   

            @ttplay
            排隊你不能離開隊伍啊,否則就會被要求重新排隊。而拿到號碼的話,可以不用一直處于長長的隊伍當中。就是區別了吧。就像我們在某一網站上注冊時,先填入帳號,再填密碼,再點提交。如果是同步的話,需提交后才知道帳號是否已被注冊,若是異步的話,填完帳號后就可以知道該帳號是否已被注冊了。
            2014-09-12 14:09 | 魏萬標

            # re: 同步/異步與阻塞/非阻塞的區別[未登錄]  回復  更多評論   

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

            2015-03-10 16:18 | 笨小孩
            精品久久久久久久无码 | 久久国产精品无码HDAV| 精品久久久久久无码中文字幕| 久久久久99精品成人片欧美| 内射无码专区久久亚洲| 97精品伊人久久久大香线蕉 | 色8激情欧美成人久久综合电| 成人精品一区二区久久久| 久久综合综合久久97色| 精品久久久久久中文字幕| 四虎国产精品免费久久5151| 人人狠狠综合久久亚洲88| 色综合久久中文综合网| 久久久精品久久久久久| 久久午夜无码鲁丝片秋霞| 久久只有这精品99| 久久久久久免费视频| 午夜精品久久久久久99热| 久久精品国产亚洲av水果派| 99久久精品费精品国产一区二区 | 无码精品久久久久久人妻中字 | 亚洲va久久久噜噜噜久久| 久久久国产乱子伦精品作者| 久久狠狠色狠狠色综合| 人妻无码久久精品| 久久国产色AV免费看| 国内精品久久久久国产盗摄| 久久人妻AV中文字幕| 久久久久久久亚洲Av无码| 久久久精品国产Sm最大网站| 亚洲AV日韩精品久久久久久久| 久久精品国产一区| 热99RE久久精品这里都是精品免费 | 奇米影视7777久久精品| 久久精品国产免费| 老男人久久青草av高清| 久久久91精品国产一区二区三区| 久久毛片免费看一区二区三区| 久久久久亚洲AV成人片 | 久久精品国产亚洲5555| 亚洲∧v久久久无码精品|