• <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>
            Creative Commons License
            本Blog采用 知識共享署名-非商業(yè)性使用-禁止演繹 3.0 Unported許可協(xié)議 進(jìn)行許可。 —— Fox <游戲人生>

            游戲人生

            游戲人生 != ( 人生 == 游戲 )
            站點(diǎn)遷移至:http://www.yulefox.com。請訂閱本博的朋友將RSS修改為http://feeds.feedburner.com/yulefox
            posts - 62, comments - 508, trackbacks - 0, articles - 7

            再辨同步/異步與阻塞/非阻塞

            Posted on 2008-09-11 01:11 Fox 閱讀(4964) 評論(12)  編輯 收藏 引用 所屬分類: T技術(shù)碎語

            網(wǎng)絡(luò)編程學(xué)習(xí)和實(shí)踐的過程中,同步(synchronous)/異步(asynchronous)阻塞(blocking)/非阻塞(non-blocking)總是會迷惑很多人。依然記得我半年之前在記述IOCP時,一句不經(jīng)意的“非阻塞I/O則是致力于提供高效的異步I/O”便引來一番口水論爭。

            今天在查一些資料的時候,看到關(guān)于這幾個詞的論辯竟不是一般的多,細(xì)細(xì)想來,這個問題似乎也確實(shí)有解釋的必要,不在于爭論對錯,而在于辨明是非。

            討論之前,先限定討論的范圍:此處之同步/異步僅限于I/O操作,與OS所討論的進(jìn)程/線程中的其他同步/異步沒有直接關(guān)系;討論的內(nèi)容是:兩對相似的術(shù)語之間的區(qū)別到底有多大。

            • 非常大:

            Douglas C. Schmidt在《C++網(wǎng)絡(luò)編程》中這樣說到:

            They are very different, as follows:

            AIO is "asynchronous I/O", i.e., the operation is invoked asynchronously and control returns to the client while the OS kernel processes the I/O request.  When the operation completes there is some mechanism for the client to retrieve the results.

            Non-blocking I/O tries an operation (such as a read() or write()) and if it the operation would block (e.g., due to flow control on a TCP connection or due to lack of data in a socket), the call returns -1 and sets errno to EWOULDBLOCK.

            翻譯如下:

            :例如,操作被異步調(diào)用時,控制權(quán)交給客戶端,I/O操作請求則交由操作系統(tǒng)內(nèi)核處理,當(dāng)操作完成后,通過某種機(jī)制將結(jié)果通知客戶端。

            非阻塞I/O:嘗試調(diào)用某操作,如果操作被阻塞,則調(diào)用返回-1并置錯誤值為EWOULDBLOCK。

            從這兩段“very different”的解釋來看,我的感覺是并沒有指出二者的區(qū)別,因?yàn)槲覀儫o法確定所謂AIO是如何處理的,如果AIO直接“調(diào)用返回-1并置錯誤值為EWOULDBLOCK”,實(shí)現(xiàn)“控制權(quán)交給客戶端”,似乎并無任何不妥。況且,對于非阻塞I/O,我們也需要“當(dāng)操作完成后,通過某種機(jī)制將結(jié)果通知客戶端”這樣的處理。

            • 無差別:

            而在Wikipedia上則直接等同二者:Asynchronous I/O, or non-blocking I/O, is a form of input/output processing that permits other processing to continue before the transmission has finished.

            當(dāng)然,對于recv和send,我們一般會說他們是阻塞起的,而不會說他們是同步起的,但這顯然不是二者的區(qū)別,因?yàn)槲覀兌贾溃?strong>阻塞的原因正是等待同步結(jié)果的返回。

            因此,二者的區(qū)別在于,阻塞/非阻塞是表現(xiàn),同步/異步是原因,我們說某某操作是阻塞起的,或者某某線程是阻塞起的,是因?yàn)樵诘却僮鹘Y(jié)果的同步返回;我們說某某操作是非阻塞的,是因?yàn)椴僮鹘Y(jié)果會通過異步方式返回。

            討論到這兒,再咬文嚼字的爭辯下去似乎已經(jīng)沒有任何實(shí)際意義。

            ------------------------------------------------------------

            PS:糾結(jié)一些必要的概念是為了加深理解,太過糾結(jié)了反倒會滯塞理解。我之前對于其概念也并非特別清楚,所以才會再續(xù)一篇特意言明,也算彌補(bǔ)一下自己的過失。

            Feedback

            # re: 再辨同步/異步與阻塞/非阻塞[未登錄]  回復(fù)  更多評論   

            2008-09-11 13:17 by Alex
            TKS,加強(qiáng)理解

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-11 14:29 by k120

            SELECT 是用于檢查SOCKET上有無可讀/可寫數(shù)據(jù),是非阻塞的,但是是同步的。

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-11 14:47 by Fox
            select在等待時間timeout>0的情況下是阻塞的,這時才有你所說的同步。
            如果timeout==0,才是非阻塞的,有無數(shù)據(jù)都是立即返回,自然沒有同步問題。

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-11 17:59 by LOGOS
            如果你是指將控制權(quán)交給客戶端,那么異步和非阻塞沒什么差別
            但是非阻塞的東西不一定會給你回調(diào)通知,而異步則一定會
            我覺得這兩個詞不是用來描述同樣的事情的

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-12 09:24 by Fox
            @LOGOS
            你說的對,但如果說“非阻塞的東西不一定會給你回調(diào)通知”,那么這時候在所阻塞和非阻塞也就沒有意義了,既然不需要回調(diào)/事件通知或其他任何形式的回饋,也就沒有阻塞的意義了,就是普通調(diào)用,無所謂阻塞不阻塞了,對吧?

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-23 15:20 by sl
            I don't know what you are talking about. Douglas had a very clear description about it: they are different.

            How can you explain that a nonblocking reading from a file descriptor will return immediately, but there is no async processing if without a proper configuring. Fox, it does make sense when you wanna polling data from the descriptor.

            Hi, buddy, Do some experiments, use fcntl() and some multi-threads or multi-proess tech. you will understand what differents are there.


            to specify nonblocking I/O
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            Use the F_SETFL command with fcntl and enable the O_NONBLOCK file flag.


            to specify AIO:
            ~~~~~~~~~~~~~~~~
            Use the F_SETFL command with fcntl and enable the O_ASYNC file flag.


            To receive the SIGIO signal, we need to perform three steps.

            1. Establish a signal handler for SIGIO, by calling either signal or sigaction.
            2. Set the process ID or process group ID to receive the signal for the descriptor, by calling fcntl with a command of F_SETOWN (Section 3.14).
            3. Enable asynchronous I/O on the descriptor by calling fcntl with a command of F_SETFL to set the O_ASYNC file status flag (Figure 3.9).

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-09-23 16:12 by Fox
            @sl
            我在上面提到“我們說某某操作是非阻塞的,是因?yàn)椴僮鹘Y(jié)果會通過異步方式返回”,Douglas說的是there is no async processing if without a proper configuring,意思是:

            非阻塞之后可以不做異步處理。

            但非阻塞和異步仍然是緊密聯(lián)系而非區(qū)別非常大。
            Douglas這本書我手頭現(xiàn)在沒有:(,翻了一下adv. pro. in UNIX,沒有看到詳細(xì)說明:(。

            # re: 再辨同步/異步與阻塞/非阻塞[未登錄]  回復(fù)  更多評論   

            2008-09-23 16:45 by Xw.Y
            作為一個不懂網(wǎng)絡(luò)編程,僅看了此片博文和之后評論的人,一下是我的理解:

            1. AIO是對于某個操作的定義,我們可以說某個函數(shù)是同步操作,或者某個函數(shù)是異步操作。
            2. non-blocking是對于某個操作結(jié)果的定義,我們可以說某一個函數(shù)(比如read)是non-blocking的,如果這個函數(shù)立即返回并且得到正常調(diào)用結(jié)果。對于同樣一個函數(shù)如果返回了一個block的標(biāo)記,那么它就是blocking的調(diào)用。

            在博主的引用和sl評論的引用中似乎都很肯定的說,
            ”AIO和non-blocking是完全同的兩件事!“

            哇哈哈,大家來砸我吧~
            (此人不懂網(wǎng)絡(luò)編程)

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2008-12-08 14:50 by yqf
            我認(rèn)為,首先要明白這些概念所描述的對象。在此可以理解為應(yīng)用進(jìn)程、內(nèi)核進(jìn)程以及IO,異步/同步描述的是前兩個在不同情況下的關(guān)系,non-blocking/blocking描述的是后兩個之間的不同處理,可以做不同組合
            非阻塞之后可以不做異步處理,非常有道理,這實(shí)際上和同步非阻塞處理事物沒有區(qū)別

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2009-01-01 16:27 by 葉先生
            “阻塞/非阻塞是表現(xiàn),同步/異步是原因”,這句總結(jié)得非常好。我同意
            “我們說某某操作是非阻塞的,是因?yàn)椴僮鹘Y(jié)果會通過異步方式返回”這句說得有點(diǎn)片面。因?yàn)榇嬖诹硪环N情況:如果某個函數(shù)表現(xiàn)為非阻塞,但他卻可能是同步的?!発120”回復(fù)中有提到這種情況,下面我也會舉例子。

            一個函數(shù)要么是同步要么是異步的,但是同步函數(shù)會引發(fā)兩種不同的表現(xiàn)。1:阻塞,在從此函數(shù)返回之前,當(dāng)前線程不能響應(yīng)其他消息。2:非阻塞,雖然還沒有從函數(shù)中返回,但是卻可以響應(yīng)其他消息。

            但是異步函數(shù)卻只有一種表現(xiàn),那就是非阻塞。

            以下兩個函數(shù)都是同步的,即是不做完事情不出返回。但卻是兩種表現(xiàn),test1在沒有返回之前,界面是不會響應(yīng)消息的,這就叫阻塞,你試著拖動一下窗體,會沒有反應(yīng),像死機(jī)一樣的。test2也是同步的,不做完事不返回的,但是你卻可以拖動窗體,窗體會重繪,這叫非阻塞。

            C#代碼:
            做一個C# WinForms的工程,在兩個按鈕事件中分別調(diào)用下面兩個不同的函數(shù)。
            void test1()//同步函數(shù),會阻塞線程
            {
            for(long i=0;i<99999999999;i++)
            {
            //什么也不做,i值到了999999999之后才返回
            }
            }
            ----------------------------------------
            void test2()//同步函數(shù),不會阻塞線程
            {
            for(long i=0;i<99999999999;i++)
            {
            Application.DoEvent();//C++程序員說這是“消息泵”
            //和上面那函數(shù)一樣,只是多了這一句而已。這句有魔術(shù)作用。有“中斷”的效
            果,會檢查消息隊(duì)列有無要處理的消息,有就會跑去執(zhí)行隊(duì)列中的消息響應(yīng)函
            數(shù),執(zhí)行完后又跑回這里來。
            }
            }

            異步函數(shù)我就一下子舉不出例子了,異步就是即時返回,執(zhí)行結(jié)果通過回調(diào),消息之類的去通知調(diào)用者,因?yàn)槭羌磿r返回,想阻塞都阻塞不了。
            理解這幾個詞還是從他們的詞性,所描述的對象出發(fā)。
            這是我個人的理解,如有錯誤,敬請具體地指錯在哪句。

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2009-01-02 13:38 by Fox
            @葉先生
            你給的第一個的例子并不太合適,阻塞實(shí)際是指因繼續(xù)執(zhí)行的條件不滿足(事件未到達(dá))而掛起等待,test1實(shí)際并未掛起,只是一直在執(zhí)行一個空循環(huán)而已。
            test2只是 多了一個DoEvent,如果討論同步還是異步,實(shí)際要視DoEvent而定,若DoEvent像你所說,那可以作為異步看待,如果DoEvent阻塞等待事件到來,則成了同步,但這都與你給的循環(huán)沒有關(guān)系。

            至于你說test1會“卡死”,那是因?yàn)閱尉€程的話,需要不停的執(zhí)行循環(huán),但沒有阻塞,因?yàn)檠h(huán)一直在跑:)

            # re: 再辨同步/異步與阻塞/非阻塞  回復(fù)  更多評論   

            2012-04-12 17:26 by 孫永杰
            "沒有從函數(shù)中返回,但是卻可以響應(yīng)其他消息"不能夠吧?響應(yīng)也是其它線程響應(yīng)的
            久久人妻少妇嫩草AV无码蜜桃 | 成人久久免费网站| 久久综合鬼色88久久精品综合自在自线噜噜 | 亚洲天堂久久久| 色婷婷综合久久久久中文 | 国内精品久久人妻互换| 亚洲国产成人久久精品影视| 久久久久国产一级毛片高清板| 日韩欧美亚洲综合久久影院Ds | 久久久这里只有精品加勒比| 色婷婷综合久久久久中文| 国产999精品久久久久久| 亚洲午夜久久久久久久久电影网| 久久久久久免费一区二区三区| 亚洲精品tv久久久久久久久久| 久久精品国产清高在天天线| 久久国产精品一区| 国产日产久久高清欧美一区| 无码八A片人妻少妇久久| 狠狠色丁香婷婷综合久久来来去| 亚洲香蕉网久久综合影视| 久久亚洲精品无码播放| 久久久综合九色合综国产| 欧洲成人午夜精品无码区久久| 伊人久久亚洲综合影院| 国产精品VIDEOSSEX久久发布| 精品免费久久久久久久| 一本一道久久综合狠狠老 | 69SEX久久精品国产麻豆| 国产成人精品综合久久久| 伊人色综合久久天天人守人婷| 99久久国产综合精品网成人影院| 久久天天躁狠狠躁夜夜96流白浆 | 日本人妻丰满熟妇久久久久久| 久久强奷乱码老熟女网站| 亚洲精品WWW久久久久久 | 久久婷婷五月综合国产尤物app| 久久久久亚洲AV无码专区首JN | 亚洲国产精品久久久久婷婷老年 | 蜜臀av性久久久久蜜臀aⅴ麻豆| 中文字幕精品久久|