關(guān)鍵字:同步(synchronous), 異步(asynchronous), 阻塞(blocking), 非阻塞(non-blocking)放仗。
最近做了不少網(wǎng)頁(yè)端AJAX請(qǐng)求與Android客戶端多線程異步請(qǐng)求的工作,因項(xiàng)目周期緊撬碟,并未花太多的時(shí)間深入學(xué)習(xí)诞挨。這段時(shí)間通過(guò)查詢資料,對(duì)這一部分的原理好好地吸收一下小作。對(duì)于IO而言亭姥,大體分為兩類四個(gè):同步/異步; 阻塞/非阻塞。那么這四個(gè)詞到底作何解釋顾稀?很多時(shí)候我們會(huì)看見(jiàn)這些詞出現(xiàn)在文章中,而且同步-阻塞坝撑、異步-非阻塞很容易被別人混淆静秆。
同步:發(fā)出一個(gè)功能調(diào)用時(shí),在沒(méi)有得到結(jié)果之前巡李,該調(diào)用就不返回抚笔。
異步:當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果侨拦。實(shí)際處理這個(gè)調(diào)用的部件在完成后殊橙,通過(guò)狀態(tài)、通知和回調(diào)通知調(diào)用者狱从。AJAX請(qǐng)求膨蛮,就是典型的異步請(qǐng)求應(yīng)用。
阻塞:阻塞調(diào)用是指調(diào)用結(jié)果返回之前季研,當(dāng)前線程會(huì)被掛起敞葛,函數(shù)只有在得到結(jié)果之后才會(huì)返回。
非阻塞:指在不能立即得到結(jié)果之前与涡,該函數(shù)不會(huì)阻塞當(dāng)前線程惹谐,而立刻返回。
![](http://jsonlog.info/wp-content/uploads/2014/12/20141224111320_87378.png)
驼卖,左圖所示氨肌,為典型的
同步阻塞I/O模型
,當(dāng)系統(tǒng)調(diào)用read函數(shù)時(shí)酌畜,首先阻塞并對(duì)內(nèi)核進(jìn)行上下文切換怎囚,然后觸發(fā)讀操作,當(dāng)讀取完畢并響應(yīng)返回(read response)檩奠,數(shù)據(jù)就被移動(dòng)到用戶空間的緩沖區(qū)中桩了,然后應(yīng)用程序會(huì)解除阻塞附帽。
同步非阻塞IO,如下圖所示井誉,非阻塞的實(shí)現(xiàn)是I/O命令可能并不會(huì)立即滿足蕉扮,需要應(yīng)用程序調(diào)用許多次來(lái)等待操作完成,這種方式可能導(dǎo)到系統(tǒng)的整體I/O吞吐量不高颗圣,下圖中喳钟,系統(tǒng)在執(zhí)行read函數(shù)時(shí),期間進(jìn)行了多次忙碌等待在岂,直到數(shù)據(jù)整體讀取完畢為止奔则。因?yàn)檫@里面沒(méi)有通知機(jī)制,因此調(diào)用整體需要read函數(shù)完成蔽午,因此稱為同步易茬。
![](http://jsonlog.info/wp-content/uploads/2014/12/20141224112132_93540.png)
異步阻塞IO, 上面提過(guò),異步IO的核心是通知機(jī)制及老,下圖是帶有阻塞通知的非阻塞 I/O抽莱。在這種模型中,配置的是非阻塞I/O骄恶,然后使用阻塞select系統(tǒng)調(diào)用來(lái)確定一個(gè)I/O描述符何時(shí)有操作食铐。使 select 調(diào)用非常有趣的是它可以用來(lái)為多個(gè)描述符提供通知,而不僅僅為一個(gè)描述符提供通知僧鲁。對(duì)于每個(gè)提示符來(lái)說(shuō)虐呻,我們可以請(qǐng)求這個(gè)描述符可以寫數(shù)據(jù)、有讀數(shù)據(jù)可用以及是否發(fā)生錯(cuò)誤的通知寞秃。(雖然異步執(zhí)行斟叼,但仍然會(huì)發(fā)生阻塞,等待通知蜕该,自己執(zhí)行)
![](http://jsonlog.info/wp-content/uploads/2014/12/20141224113147_29948.png)
異步非阻塞IO,最后犁柜,異步非阻塞I/O 模型是一種處理與 I/O 重疊進(jìn)行的模型。讀請(qǐng)求會(huì)立即返回堂淡,說(shuō)明read請(qǐng)求已經(jīng)成功發(fā)起了馋缅。在后臺(tái)完成讀操作時(shí),應(yīng)用程序然后會(huì)執(zhí)行其他處理操作绢淀。當(dāng)read的響應(yīng)到達(dá)時(shí)萤悴,就會(huì)產(chǎn)生一個(gè)信號(hào)或執(zhí)行一個(gè)基于線程的回調(diào)函數(shù)來(lái)完成這次I/O處理過(guò)程。(read請(qǐng)求為非阻塞的皆的,但異步通知方式上采用了回調(diào)函數(shù)機(jī)制覆履,無(wú)需應(yīng)用程序再去處理)