1.IO類(lèi)型 BIO NIO AIO
IO的方式通常分為幾種,同步阻塞的BIO,同步非阻塞的NIO,異步非阻塞的AIO
(1)BIO:JDK1.4之前,建立網(wǎng)絡(luò)連接采用BIO模式,需要現(xiàn)在服務(wù)端啟動(dòng)一個(gè)ServerSocket,然后再客戶(hù)端啟動(dòng)Socket來(lái)對(duì)服務(wù)
端進(jìn)行通信,默認(rèn)情況下服務(wù)端需要對(duì)每個(gè)請(qǐng)求建立一堆線(xiàn)程等待請(qǐng)求,而在客戶(hù)端發(fā)送請(qǐng)求后,先咨詢(xún)服務(wù)端是否有線(xiàn)程響
應(yīng),如果沒(méi)有則會(huì)一直等待,如果有的話(huà),客戶(hù)端會(huì)等待線(xiàn)程結(jié)束后才繼續(xù)執(zhí)行。
(2)NIO:繼續(xù)實(shí)踐驅(qū)動(dòng)思想來(lái)完成。NIO基于Reactor模式來(lái)實(shí)現(xiàn)的,相當(dāng)于一個(gè)線(xiàn)程處理大量的客戶(hù)端請(qǐng)求,通過(guò)一個(gè)線(xiàn)程輪
詢(xún)大量的channel,每次就獲取一批有事件的channel,然后對(duì)每個(gè)請(qǐng)求啟動(dòng)一個(gè)線(xiàn)程處理。
非阻塞,selector一個(gè)線(xiàn)程不停輪詢(xún)channel,所有的客戶(hù)端請(qǐng)求都不會(huì)阻塞,直接就會(huì)進(jìn)來(lái)。
相對(duì)于bio的優(yōu)化:一個(gè)客戶(hù)端并不是時(shí)時(shí)刻刻都有數(shù)據(jù)進(jìn)行交互,沒(méi)必要死耗著一個(gè)線(xiàn)程不放,所以客戶(hù)端選擇讓線(xiàn)程歇一歇,
只有客戶(hù)端有相應(yīng)的操作的時(shí)候才發(fā)起通知,創(chuàng)建一個(gè)線(xiàn)程來(lái)處理請(qǐng)求。
(3)AIO:異步非阻塞IO,基于Proactor模型實(shí)現(xiàn)。每個(gè)連接發(fā)送過(guò)來(lái)的請(qǐng)求,都會(huì)綁定到一個(gè)buffer,然后通知操作系統(tǒng)去完成
異步的讀,這個(gè)時(shí)間你就可以去做其他的事情,等到操作系統(tǒng)完成讀之后,就會(huì)調(diào)用你的接口,給你操作系統(tǒng)異步讀完的數(shù)據(jù)。
這個(gè)時(shí)候你就可以拿到數(shù)據(jù)進(jìn)行處理,將數(shù)據(jù)往回寫(xiě),在往回寫(xiě)的過(guò)程,同樣是給操作系統(tǒng)一個(gè)buffer,讓操作系統(tǒng)去完成寫(xiě),寫(xiě)
完了來(lái)通知你。這兩個(gè)過(guò)程都有buffer存在,數(shù)據(jù)是通過(guò)buffer來(lái)完成讀寫(xiě)的。
這里面的主要區(qū)別在于將數(shù)據(jù)寫(xiě)入到緩沖區(qū)后,就不去管它,剩下的交給操作系統(tǒng)去完成。操作系統(tǒng)寫(xiě)回?cái)?shù)據(jù)也是一樣,寫(xiě)到
buffer里面,寫(xiě)完后通知客戶(hù)端來(lái)警醒讀取數(shù)據(jù)。
基本概念:
同步和異步:同步和異步是針對(duì)應(yīng)用程序和內(nèi)核的交互而言的。
同步指的是用戶(hù)進(jìn)程觸發(fā)IO操作,等待或輪詢(xún)的去查看IO操作是否就緒;
異步指的是用戶(hù)進(jìn)程觸發(fā)IO操作以后便開(kāi)始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時(shí)候就會(huì)得到IO完成的通知。
阻塞和非阻塞:阻塞和非阻塞是針對(duì)進(jìn)程在訪(fǎng)問(wèn)數(shù)據(jù)的時(shí)候,根據(jù)IO的就緒狀態(tài)來(lái)采取不同的方式,說(shuō)白了是一種讀取或?qū)懭ゲ?作方法的實(shí)現(xiàn)方式。
阻塞方式下,讀取或?qū)懭牒瘮?shù)將會(huì)一直等待;
非阻塞方式下,讀取或?qū)懭敕椒〞?huì)立即放回一個(gè)狀態(tài)值。