青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Creative Commons License
本Blog采用 知識共享署名-非商業性使用-禁止演繹 3.0 Unported許可協議 進行許可。 —— Fox <游戲人生>

游戲人生

游戲人生 != ( 人生 == 游戲 )
站點遷移至: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 閱讀(4986) 評論(12)  編輯 收藏 引用 所屬分類: T技術碎語

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

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

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

  • 非常大:

Douglas C. Schmidt在《C++網絡編程》中這樣說到:

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.

翻譯如下:

:例如,操作被異步調用時,控制權交給客戶端,I/O操作請求則交由操作系統內核處理,當操作完成后,通過某種機制將結果通知客戶端。

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

從這兩段“very different”的解釋來看,我的感覺是并沒有指出二者的區別,因為我們無法確定所謂AIO是如何處理的,如果AIO直接“調用返回-1并置錯誤值為EWOULDBLOCK”,實現“控制權交給客戶端”,似乎并無任何不妥。況且,對于非阻塞I/O,我們也需要“當操作完成后,通過某種機制將結果通知客戶端”這樣的處理。

  • 無差別:

而在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.

當然,對于recv和send,我們一般會說他們是阻塞起的,而不會說他們是同步起的,但這顯然不是二者的區別,因為我們都知道,阻塞的原因正是等待同步結果的返回

因此,二者的區別在于,阻塞/非阻塞是表現,同步/異步是原因,我們說某某操作是阻塞起的,或者某某線程是阻塞起的,是因為在等待操作結果的同步返回;我們說某某操作是非阻塞的,是因為操作結果會通過異步方式返回。

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

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

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

Feedback

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

2008-09-11 13:17 by Alex
TKS,加強理解

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

2008-09-11 14:29 by k120

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

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

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

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

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

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

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

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

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: 再辨同步/異步與阻塞/非阻塞  回復  更多評論   

2008-09-23 16:12 by Fox
@sl
我在上面提到“我們說某某操作是非阻塞的,是因為操作結果會通過異步方式返回”,Douglas說的是there is no async processing if without a proper configuring,意思是:

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

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

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

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

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

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

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

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

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

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

2009-01-01 16:27 by 葉先生
“阻塞/非阻塞是表現,同步/異步是原因”,這句總結得非常好。我同意
“我們說某某操作是非阻塞的,是因為操作結果會通過異步方式返回”這句說得有點片面。因為存在另一種情況:如果某個函數表現為非阻塞,但他卻可能是同步的。“k120”回復中有提到這種情況,下面我也會舉例子。

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

但是異步函數卻只有一種表現,那就是非阻塞。

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

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

異步函數我就一下子舉不出例子了,異步就是即時返回,執行結果通過回調,消息之類的去通知調用者,因為是即時返回,想阻塞都阻塞不了。
理解這幾個詞還是從他們的詞性,所描述的對象出發。
這是我個人的理解,如有錯誤,敬請具體地指錯在哪句。

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

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

至于你說test1會“卡死”,那是因為單線程的話,需要不停的執行循環,但沒有阻塞,因為循環一直在跑:)

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

2012-04-12 17:26 by 孫永杰
"沒有從函數中返回,但是卻可以響應其他消息"不能夠吧?響應也是其它線程響應的
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区视频免费在线观看| 久久久久国内| 欧美日韩一区二区三区在线观看免| 亚洲国产欧美国产综合一区| 欧美福利影院| 欧美日韩精品是欧美日韩精品| 一区二区日韩伦理片| 一区二区高清在线观看| 欧美日韩免费在线视频| 欧美亚洲免费在线| 久久久五月婷婷| 亚洲免费成人| 亚洲免费在线精品一区| 激情综合在线| 99国内精品| 国模吧视频一区| 亚洲国产成人久久综合| 欧美好吊妞视频| 午夜国产精品影院在线观看| 久久精品综合一区| 一本综合精品| 久久精品视频在线看| 99精品视频免费全部在线| 亚洲一区二区精品在线观看| 黄网动漫久久久| 一片黄亚洲嫩模| 激情综合五月天| 亚洲深夜福利视频| 亚洲国产清纯| 午夜精品久久久久久久久久久久| 亚洲国产精品久久精品怡红院| 亚洲一区二区成人| 亚洲人成网站在线观看播放| 亚洲性人人天天夜夜摸| 亚洲精品视频在线观看免费| 欧美一区二区啪啪| 亚洲一区二区动漫| 欧美不卡福利| 久久久www| 国产精品乱码一区二三区小蝌蚪 | 国产精品一区视频| 亚洲欧洲综合另类在线| 国内精品99| 亚洲欧美日韩国产一区二区| 亚洲乱码国产乱码精品精天堂| 欧美一区视频在线| 欧美亚洲午夜视频在线观看| 欧美日韩免费精品| 亚洲精品久久久久久下一站| 黄色精品一区| 亚洲欧美日韩精品久久奇米色影视 | 欧美在线www| 欧美亚洲免费电影| 国产精品jizz在线观看美国 | 亚洲三级观看| 亚洲剧情一区二区| 蜜桃伊人久久| 欧美二区乱c少妇| 亚洲高清在线播放| 久久天天躁夜夜躁狠狠躁2022| 久久精品国产免费观看| 国产亚洲精品aa午夜观看| 亚洲视屏在线播放| 亚洲欧美怡红院| 国产精品看片你懂得| 亚洲婷婷免费| 久久精品视频免费| 狠狠做深爱婷婷久久综合一区| 欧美在线免费观看视频| 久久久精品免费视频| 国产亚洲精品aa午夜观看| 欧美有码在线观看视频| 久久免费精品视频| 在线欧美日韩精品| 欧美激情国产高清| aa国产精品| 久久精品国产99精品国产亚洲性色| 国产欧美一区二区三区在线老狼 | 久久久91精品国产一区二区三区 | 欧美粗暴jizz性欧美20| 亚洲精品网站在线播放gif| 亚洲永久免费av| 国产日韩精品一区| 久久久一二三| 亚洲理伦在线| 久久精品人人做人人爽| 在线看一区二区| 欧美日韩免费看| 欧美一级一区| 亚洲国产天堂久久综合| 亚洲一区二区三区四区五区午夜| 国产精品综合久久久| 你懂的网址国产 欧美| 99ri日韩精品视频| 久久久免费精品视频| 日韩一区二区福利| 国产精品一区视频| 麻豆精品国产91久久久久久| 中文一区二区在线观看| 久久一区亚洲| 亚洲欧美国产日韩天堂区| 伊人伊人伊人久久| 国产精品国产三级国产aⅴ浪潮| 久久精品99| 在线一区亚洲| 欧美好骚综合网| 久久精品国产亚洲精品| 99riav国产精品| 免费看亚洲片| 欧美在线视频在线播放完整版免费观看| 欧美黄色一区二区| 欧美在线综合| 日韩视频三区| 136国产福利精品导航| 国产精品盗摄一区二区三区| 美女日韩欧美| 性久久久久久久久久久久| 一区二区三区|亚洲午夜| 亚洲第一区在线| 老司机成人网| 久久精品一区二区三区四区| 亚洲伊人观看| 一区二区三区日韩在线观看| 在线精品国精品国产尤物884a| 国产精品一区=区| 欧美日韩18| 欧美日韩国产综合视频在线观看| 久久久久久久999| 欧美一区二区三区免费看| 亚洲深夜av| 亚洲一二三四区| 一区二区三区|亚洲午夜| 日韩午夜激情av| 亚洲人成网站精品片在线观看 | 久久人人爽人人| 久久成人精品电影| 欧美一进一出视频| 欧美亚洲在线| 欧美一区二区精品久久911| 亚洲欧美日韩精品久久久久| 亚洲欧美日韩精品久久亚洲区 | 亚洲第一成人在线| 一区二区三区自拍| 在线成人av| 亚洲国产精品国自产拍av秋霞| 亚洲激情二区| 99成人在线| 亚洲在线观看视频| 香蕉尹人综合在线观看| 久久国产乱子精品免费女 | 亚洲欧美日韩国产成人精品影院| 亚洲特级片在线| 亚洲欧美日韩国产一区二区三区 | 久久久最新网址| 欧美激情精品久久久| 最新成人在线| 亚洲精品日韩在线| 亚洲午夜成aⅴ人片| 校园激情久久| 蜜臀av国产精品久久久久| 欧美日韩国产不卡在线看| 国产精品中文字幕在线观看| 国产综合自拍| av成人激情| 久久成人久久爱| 欧美成人精品在线| 亚洲免费久久| 久久av一区二区三区亚洲| 麻豆精品91| 国产精品美女久久福利网站| 激情综合网激情| 中国成人黄色视屏| 久久国产婷婷国产香蕉| 亚洲国产va精品久久久不卡综合| 日韩图片一区| 欧美在线一区二区| 欧美成人一区二区三区在线观看| 国产精品久久久久9999高清 | 欧美午夜宅男影院在线观看| 国内精品一区二区| 亚洲二区免费| 99riav国产精品| 久久久噜噜噜久久狠狠50岁| 欧美日韩精品二区| 好吊色欧美一区二区三区四区| 亚洲精品视频在线| 久久精品亚洲一区二区三区浴池| 欧美激情一区在线观看| 亚洲午夜av电影| 欧美精品xxxxbbbb| 国产亚洲精品高潮| 亚洲深爱激情| 欧美成人小视频| 亚洲欧美日韩综合一区| 欧美精品一区三区| 影音先锋一区| 欧美一区二区视频在线观看| 亚洲美女少妇无套啪啪呻吟| 美女精品网站| 亚洲第一综合天堂另类专|