此文參考:iteye
在高性能的IO體系設(shè)計(jì)中,有幾個(gè)名詞概念常常會(huì)使我們感到迷惑不解盛霎。
1.什么是同步赠橙?
2.什么是異步?
3.什么是阻塞愤炸?
4.什么是非阻塞期揪?
5.什么是同步阻塞?
6.什么是同步非阻塞规个?
7.什么是異步阻塞凤薛?
8.什么是異步非阻塞?
1.同步诞仓,異步缤苫,阻塞,非阻塞 的定義
1.同步和異步是針對應(yīng)用程序和內(nèi)核的交互而言的墅拭。
2.阻塞和非阻塞是針對于進(jìn)程在訪問數(shù)據(jù)的時(shí)候活玲,根據(jù)IO操作的就緒狀態(tài)來采取的不同方式,說白了是一種讀取或者寫入操作函數(shù)的實(shí)現(xiàn)方式谍婉,阻塞方式下讀取或者寫入函數(shù)將一直等待舒憾,而非阻塞方式下,讀取或者寫入函數(shù)會(huì)立即返回一個(gè)狀態(tài)值穗熬。
由上描述基本可以總結(jié)一句簡短的話镀迂,同步和異步是目的,阻塞和非阻塞是實(shí)現(xiàn)方式唤蔗。
2.區(qū)別圖
id | 名詞 | 解釋 | example |
---|---|---|---|
1 | 同步 | 指的是用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否就緒 | 自己親自出馬持銀行卡到銀行取錢(使用同步IO時(shí)招拙,Java自己處理IO讀寫) |
2 | 異步 | 異步是指用戶進(jìn)程觸發(fā)IO操作以后便開始做自己的事情唧瘾,而當(dāng)IO操作已經(jīng)完成的時(shí)候會(huì)得到IO完成的通知(異步的特點(diǎn)就是通知) | 委托一小弟拿銀行卡到銀行取錢,然后給你(使用異步IO時(shí)别凤,Java將IO讀寫委托給OS處理,需要將數(shù)據(jù)緩沖區(qū)地址和大小傳給OS(銀行卡和密碼)领虹,OS需要支持異步IO操作API) |
3 | 阻塞 | 所謂阻塞方式的意思是指, 當(dāng)試圖對該文件描述符進(jìn)行讀寫時(shí), 如果當(dāng)時(shí)沒有東西可讀,或者暫時(shí)不可寫, 程序就進(jìn)入等待 狀態(tài), 直到有東西可讀或者可寫為止 | ATM排隊(duì)取款规哪,你只能等待(使用阻塞IO時(shí),Java調(diào)用會(huì)一直阻塞到讀寫完成才返回)塌衰; |
4 | 非阻塞 | 非阻塞狀態(tài)下, 如果沒有東西可讀, 或者不可寫, 讀寫函數(shù)馬上返回, 而不會(huì)等待 | 柜臺(tái)取款诉稍,取個(gè)號,然后坐在椅子上做其它事最疆,等號廣播會(huì)通知你辦理杯巨,沒到號你就不能去,你可以不斷問大堂經(jīng)理排到了沒有努酸,大堂經(jīng)理如果說還沒到你就不能去(使用非阻塞IO時(shí)服爷,如果不能讀寫Java調(diào)用會(huì)馬上返回,當(dāng)IO事件分發(fā)器會(huì)通知可讀寫時(shí)再繼續(xù)進(jìn)行讀寫获诈,不斷循環(huán)直到讀寫完成) |
3.組合狀態(tài):
同步阻塞IO(JAVA BIO):
同步并阻塞仍源,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理舔涎,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開銷笼踩,當(dāng)然可以通過線程池機(jī)制改善。
同步非阻塞IO(Java NIO) :
同步非阻塞亡嫌,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請求一個(gè)線程嚎于,即客戶端發(fā)送的連接請求都會(huì)注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理挟冠。用戶進(jìn)程也需要時(shí)不時(shí)的詢問IO操作是否就緒于购,這就要求用戶進(jìn)程不停的去詢問。
異步阻塞IO(Java NIO):
此種方式下是指應(yīng)用發(fā)起一個(gè)IO操作以后圃郊,不等待內(nèi)核IO操作的完成价涝,等內(nèi)核完成IO操作以后會(huì)通知應(yīng)用程序,這其實(shí)就是同步和異步最關(guān)鍵的區(qū)別持舆,同步必須等待或者主動(dòng)的去詢問IO是否完成色瘩,那么為什么說是阻塞的呢?因?yàn)榇藭r(shí)是通過select系統(tǒng)調(diào)用來完成的逸寓,而select函數(shù)本身的實(shí)現(xiàn)方式是阻塞的居兆,而采用select函數(shù)有個(gè)好處就是它可以同時(shí)監(jiān)聽多個(gè)文件句柄(如果從UNP的角度看,select屬于同步操作竹伸。因?yàn)閟elect之后泥栖,進(jìn)程還需要讀寫數(shù)據(jù))簇宽,從而提高系統(tǒng)的并發(fā)性!
(Java AIO (NIO.2))異步非阻塞IO :
在此種模式下吧享,用戶進(jìn)程只需要發(fā)起一個(gè)IO操作然后立即返回魏割,等IO操作真正的完成以后,應(yīng)用程序會(huì)得到IO操作完成的通知钢颂,此時(shí)用戶進(jìn)程只需要對數(shù)據(jù)進(jìn)行處理就好了钞它,不需要進(jìn)行實(shí)際的IO讀寫操作,因?yàn)檎嬲腎O讀取或者寫入操作已經(jīng)由內(nèi)核完成了殊鞭。
4.BIO遭垛、NIO、AIO適用場景分析:
BIO方式適用于連接數(shù)目比較小且固定的架構(gòu)操灿,這種方式對服務(wù)器資源要求比較高锯仪,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇趾盐,但程序直觀簡單易理解庶喜。
NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器谤碳,并發(fā)局限于應(yīng)用中溃卡,編程比較復(fù)雜,JDK1.4開始支持蜒简。
AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu)瘸羡,比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作搓茬,編程比較復(fù)雜犹赖,JDK7開始支持。