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

那誰的技術(shù)博客

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

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

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

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

首先來解釋同步和異步的概念,這兩個(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)的人)通過某種機(jī)制(在這里是寫在小紙條上的號(hào)碼)找到等待該事件的人.
而在實(shí)際的程序中,同步消息處理就好比簡單的read/write操作,它們需要等待這兩個(gè)操作成功才能返回;而異步處理機(jī)制就是類似于select/poll之類的多路復(fù)用IO操作,當(dāng)所關(guān)注的消息被觸發(fā)時(shí),由消息觸發(fā)機(jī)制通知觸發(fā)對(duì)消息的處理.

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

很多人會(huì)把同步和阻塞混淆,我想是因?yàn)楹芏鄷r(shí)候同步操作會(huì)以阻塞的形式表現(xiàn)出來,比如很多人會(huì)寫阻塞的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)沒有人了,所以你再去柜臺(tái)辦理業(yè)務(wù)就不會(huì)被阻塞.

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

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

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

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

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

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




posted on 2009-05-13 22:11 那誰 閱讀(53198) 評(píng)論(42)  編輯 收藏 引用 所屬分類: 網(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è)處理,就輪到你了。

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

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

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

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

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

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

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

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

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

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

我的理解:

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

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

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

將" select"歸類為異步+blocking不妥,select實(shí)際上完成的只是read/write的第一部分:等待條件就緒;唯一的改進(jìn)是可以等待多個(gè)條件。"select + read/write"的調(diào)用形式容易產(chǎn)生"系統(tǒng)通知我條件就緒"的假象,可實(shí)際上你不過是在條件就緒的時(shí)候醒來,然后仍然親自動(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一書中6.2節(jié)對(duì)I/O模型的分類我覺得很合理:

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

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










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

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

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

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

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

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

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

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

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

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

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

@ttplay
在你下面的回復(fù)我沒看
我理解的是
拿紙條和 排隊(duì)的區(qū)別在于
排隊(duì)的 必須自己 一直看前面是否有人 沒人就是到自己了
拿紙條的就可以這樣理解
坐在那里愛 干嘛干嘛 等輪到他時(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ū)別[未登錄]  回復(fù)  更多評(píng)論   

@嘯天豬

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

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

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

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

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

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

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

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

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

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


2010-11-08 00:01 | yangtou

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

靠,純粹是誤人子弟
select/poll是同步的,你竟然拿來三番五次的作為異步的例子來講
select/poll機(jī)制本來就叫多路復(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ū)別[未登錄]  回復(fù)  更多評(píng)論   

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

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

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

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

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


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

//一個(gè)封裝socket的類,select函數(shù)返回后會(huì)根據(jù)不同的socket句柄調(diào)用相應(yīng)的類的接收數(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類,然后調(diào)用Client的函數(shù)OnRecvRead();
OnRecvRead里面再分析協(xié)議,然后調(diào)用不同的函數(shù)。
}
}


給客戶導(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”。
}


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



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

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

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

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

我覺得可以簡單一點(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)論   

@那誰
這篇文章,我同意嘯天豬的概念。
同步異步我認(rèn)為不是描述消息如何通知,而是兩個(gè)動(dòng)作的處理方式:咱倆并行?還是串行?是順序?還是并發(fā)?如果單講IO這一步,就不存在同步異步的問題。
比如我們一般的硬盤是同步IO,在允許讀寫時(shí),cpu要等讀寫完成后,才能做下一件事情,就是串行;而某些SCSI卡自幾有CPU, 如果它肯幫你做讀寫的話,我們的CPU就可以不管讀寫動(dòng)作是否完成,而直接去做下一件事情了。類型豬說的那個(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ū)別[未登錄]  回復(fù)  更多評(píng)論   

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

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

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

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

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

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

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

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

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

所以個(gè)人認(rèn)為:同步和異步的標(biāo)志是看是否有新的人被“創(chuàng)造”出來。
而阻塞和非阻塞的標(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的闡述有些問題,也是與嘯天豬的分歧所在,但是其關(guān)于異步/同步,阻塞/非阻塞的觀點(diǎn)很易理解也解釋的很到位。
select稱為“多路復(fù)用i/o”,其并不提供將數(shù)據(jù)從用戶空間搬移到內(nèi)核空間,或從內(nè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ù)成功寫入用戶空間或內(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等,并不能簡單的將1個(gè)函數(shù)歸類于是異步的還是同步的。
而對(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í)候還可以看看書,玩玩游戲,效率高。
2012-10-27 15:11 | 直言

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

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

# re: 同步/異步與阻塞/非阻塞的區(qū)別[未登錄]  回復(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)論   

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

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

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

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

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

2015-03-10 16:18 | 笨小孩
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区四区五区精品视频| 羞羞答答国产精品www一本| 这里只有精品电影| 日韩一区二区免费看| 亚洲理论在线| 亚洲精选久久| 亚洲一区二区三区乱码aⅴ| 亚洲一区二区高清| 欧美尤物一区| 欧美+亚洲+精品+三区| 欧美国内亚洲| 99re热这里只有精品免费视频| 99综合视频| 欧美一区二区三区的| 免费在线成人av| 欧美性大战久久久久久久| 国产女人aaa级久久久级| 一区在线免费观看| 亚洲视频视频在线| 麻豆视频一区二区| 在线视频欧美精品| 久久青草欧美一区二区三区| 欧美久久久久久久久久| 国产欧美日韩另类一区| 亚洲欧洲综合另类| 欧美一区午夜精品| 亚洲欧洲一区二区在线观看| 999亚洲国产精| 久久久999精品免费| 欧美日韩国产在线一区| 黑人巨大精品欧美一区二区小视频 | 国产麻豆精品久久一二三| 在线播放不卡| 午夜亚洲福利| 国产精品xxx在线观看www| 久久久久久香蕉网| 国产精品激情av在线播放| 在线欧美日韩精品| 欧美一区二区三区在线视频| 欧美国产激情| 久久精品国产视频| 国产精品一二三| 亚洲色无码播放| 亚洲国产成人在线| 久久成人人人人精品欧| 国产精品久久久久久久久借妻| 亚洲黄一区二区| 蜜桃av一区| 久久精品国产久精国产爱| 国产女主播一区二区| 亚洲一区三区视频在线观看| 亚洲国产一区二区a毛片| 卡通动漫国产精品| 影院欧美亚洲| 蜜桃av综合| 女人天堂亚洲aⅴ在线观看| 伊人久久噜噜噜躁狠狠躁| 久久黄色小说| 欧美亚洲一区二区在线观看| 国产精品外国| 欧美一区1区三区3区公司| 亚洲一二三区视频在线观看| 欧美视频观看一区| 亚洲午夜一区二区三区| 亚洲开发第一视频在线播放| 欧美精品日韩一本| 亚洲午夜一区二区三区| 亚洲视频在线二区| 国产精品你懂的在线| 午夜影院日韩| 欧美一级在线亚洲天堂| 国产一区二区电影在线观看| 久久国产精品久久久久久久久久| 欧美一区二区三区视频免费播放| 国产一级一区二区| 欧美成人网在线| 欧美精品自拍| 欧美在线网站| 麻豆成人在线观看| 亚洲午夜影视影院在线观看| 亚洲欧美一区二区精品久久久| 国内外成人在线| 亚洲国产成人精品久久久国产成人一区 | 欧美成人在线免费观看| a91a精品视频在线观看| 一区二区福利| 狠狠色丁香婷婷综合久久片| 欧美电影电视剧在线观看| 欧美精品久久一区二区| 性做久久久久久久免费看| 欧美在线观看一区二区| 日韩午夜在线观看视频| 国产精品二区在线| 久久成人综合视频| 免费人成精品欧美精品| 制服诱惑一区二区| 欧美中文字幕不卡| 亚洲精品美女在线观看播放| 正在播放欧美一区| 在线日韩欧美| 亚洲综合色婷婷| 日韩系列欧美系列| 欧美影院成年免费版| 亚洲精品影视在线观看| 午夜精品免费| 亚洲深爱激情| 麻豆精品精华液| 久久久国产成人精品| 欧美日韩在线另类| 欧美二区在线观看| 国产日韩av一区二区| 亚洲欧洲在线免费| 精品91免费| 午夜日韩电影| 午夜精品成人在线视频| 欧美精彩视频一区二区三区| 久久免费视频网| 国产乱理伦片在线观看夜一区| 亚洲国产一区二区三区高清| 黄色精品在线看| 新片速递亚洲合集欧美合集| 亚洲影音先锋| 欧美午夜视频网站| 亚洲精选一区| 亚洲人成人77777线观看| 久久精品视频亚洲| 久久精品2019中文字幕| 国产精品免费看久久久香蕉| 日韩一区二区久久| 亚洲午夜久久久| 欧美视频在线观看 亚洲欧| 亚洲欧洲日本一区二区三区| 亚洲国产精品一区二区第一页| 久久精品系列| 美女主播精品视频一二三四| 精久久久久久久久久久| 久久精品一区二区国产| 久久亚洲图片| 亚洲第一精品夜夜躁人人躁| 久久久久91| 免费在线日韩av| 亚洲国产另类精品专区| 欧美xart系列高清| 亚洲日本成人在线观看| 夜夜爽99久久国产综合精品女不卡| 欧美成人精品h版在线观看| 亚洲黄色在线看| 夜夜夜久久久| 欧美系列精品| 欧美一级在线播放| 欧美福利一区二区| 99精品国产在热久久| 欧美三级免费| 欧美在线地址| 免费观看日韩| 一区二区三区视频在线观看| 国产在线视频欧美一区二区三区| 欧美一区在线看| 欧美不卡一区| 中国女人久久久| 国产视频欧美视频| 美女视频黄免费的久久| 亚洲精品资源| 久久国产乱子精品免费女| 精品成人一区二区三区| 欧美国产在线观看| 亚洲一区二区高清| 蜜臀av一级做a爰片久久| 亚洲免费观看高清完整版在线观看熊 | 亚洲图片欧美日产| 极品日韩av| 欧美日韩国产精品| 欧美一级在线亚洲天堂| 亚洲激情成人网| 欧美一区激情视频在线观看| 亚洲国产日韩美| 国产精品亚洲综合| 免费成人av资源网| 亚洲欧美日韩精品久久奇米色影视| 久久只有精品| 午夜日韩福利| 亚洲精品影视| 在线观看欧美精品| 国产精品一区二区久激情瑜伽| 欧美成人三级在线| 欧美专区一区二区三区| 99精品视频网| 亚洲福利视频网站| 久久尤物电影视频在线观看| 亚洲一区二区精品在线| 在线视频成人| 国产一区二区三区观看| 欧美三区视频| 欧美好骚综合网| 老**午夜毛片一区二区三区| 亚洲综合色噜噜狠狠| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美国产日韩a欧美在线观看| 性8sex亚洲区入口| 亚洲图片激情小说|