Yanghn Notes

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            10 Posts :: 10 Stories :: 2 Comments :: 0 Trackbacks

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

                最近生產(chǎn)系統(tǒng)出現(xiàn)了異常,在大數(shù)據(jù)量socket交互時(shí),服務(wù)器端報(bào)文接受不完整。 解決過(guò)程發(fā)現(xiàn)自己對(duì)很多概念不是很理解,需要加強(qiáng)一下。

          實(shí)戰(zhàn)派的解釋:

          比如我去銀行辦理業(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ī)制就是類似于 select/poll 之類的多路復(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í)候一邊打打電話發(fā)發(fā)短信一邊等待,這樣的狀態(tài)就是非阻塞的,因?yàn)樗?等待者)沒(méi)有阻塞在這個(gè)消息通知上,而是一邊做自己的事情一邊等待.但是需要注意了,第一種同步非阻塞形式實(shí)際上是效率低下的,想象一下你一邊打著電話一邊還需要抬頭看到底隊(duì)伍排到你了沒(méi)有,如果把打電話和觀察排隊(duì)的位置看成是程序的兩個(gè)操作的話,這個(gè)程序需要在這兩種不同的行為之間來(lái)回的切換,效率可想而知是低下的;而后者,異步非阻塞形式卻沒(méi)有這樣的問(wèn)題,因?yàn)榇螂娫捠悄?等待者)的事情,而通知你則是柜臺(tái)(消息觸發(fā)機(jī)制)的事情,程序沒(méi)有在兩種不同的操作中來(lái)回切換.

          學(xué)術(shù)派的解釋:

          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

          翻譯如下:

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

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

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

           

          posted on 2010-05-10 10:01 小海 閱讀(194) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 平远县| 阳新县| 安西县| 梅河口市| 青田县| 黄骅市| 仁化县| 新平| 秦皇岛市| 田东县| 盐城市| 大厂| 乐亭县| 太康县| 郑州市| 浮梁县| 齐河县| 吉木萨尔县| 德州市| 南乐县| 牙克石市| 苏州市| 航空| 九寨沟县| 登封市| 尚志市| 华阴市| 修水县| 承德市| 丹巴县| 曲阳县| 蕉岭县| 称多县| 丹阳市| 江孜县| 岐山县| 晋城| 闸北区| 高密市| 邵阳县| 留坝县|