談java web server與io形式
在jdk6中有兩種IO:BIO和NIO,真正的AIO還沒有實(shí)現(xiàn).
IO操作在操作系統(tǒng)中可以需要分為兩步,第一步為等待操作系統(tǒng)的數(shù)據(jù)準(zhǔn)備,第二步是從內(nèi)核態(tài)的buffer到用戶態(tài)的buffer的拷貝,BIO是在第一步準(zhǔn)備狀態(tài)就等待,直到讀取數(shù)據(jù)返回,NIO則是在第一步的時(shí)候,如果沒有數(shù)據(jù)就直接返回,過一段時(shí)間再繼續(xù)請求,當(dāng)發(fā)現(xiàn)第一步的數(shù)據(jù)準(zhǔn)備好了,然后在第二步仍然等待.多路復(fù)用的NIO只是在第一步時(shí)候每一個(gè)操作都會注冊到多路復(fù)用器,這樣多路復(fù)用器進(jìn)行輪詢,查看每一個(gè)的操作的數(shù)據(jù)有沒有準(zhǔn)備好,準(zhǔn)備好的通知這個(gè)操作讀取數(shù)據(jù),第二步還是需要等待的。
AIO則是第一步的時(shí)候操作請求后返回,直到第二步已經(jīng)完成,然后想辦法通知這個(gè)操作數(shù)據(jù)已經(jīng)準(zhǔn)備好 。
java web server對于jdk的IO的形式,出現(xiàn)了三種http請求的處理方式:
1.BIO處理方式 2.NIO處理方式 3.Async 處理方式
BIO處理方式
這種是最簡單的處理方式,代碼也好編寫,基本上是一個(gè)連接一個(gè)線程模式,這樣在請求上來的時(shí)候,由于受限于服務(wù)器的內(nèi)存大小,cpu大小,線程數(shù)上限大小,是不能達(dá)到一個(gè)很高的并發(fā)數(shù)的,再者,這種模式的內(nèi)存和cpu都很高,對應(yīng)用來說不是個(gè)好現(xiàn)象
NIO處理方式
NIO的最重要的地方是當(dāng)一個(gè)連接創(chuàng)建后,不需要對應(yīng)一個(gè)線程,這個(gè)連接會被注冊到多路復(fù)用器上面,所以所有的連接只需要一個(gè)線程就可以搞定,當(dāng)這個(gè)線程中的多路復(fù)用器進(jìn)行輪詢的時(shí)候,發(fā)現(xiàn)連接上有請求的話,才開啟一個(gè)線程進(jìn)行處理,也就是一個(gè)請求一個(gè)線程模式
Async 處理方式
在NIO的處理方式中,當(dāng)一個(gè)請求來的話,開啟線程進(jìn)行處理,可能會等待后端應(yīng)用的資源(JDBC連接等),其實(shí)這個(gè)線程就被阻塞了,當(dāng)并發(fā)上來的話,還是會有BIO一樣的問題
HTTP/1.1出現(xiàn)后,有了Http長連接,這樣除了超時(shí)和指明特定關(guān)閉的http header外,這個(gè)鏈接是一直打開的狀態(tài)的,
這樣在NIO處理中可以進(jìn)一步的進(jìn)化,在后端資源中可以實(shí)現(xiàn)資源池或者隊(duì)列,當(dāng)請求來的話,開啟的線程把請求和請求數(shù)據(jù)傳送給后端資源池或者隊(duì)列里面就返回,并且在全局的地方保持住這個(gè)現(xiàn)場(哪個(gè)連接的哪個(gè)請求等)。
這樣前面的線程還是可以去接受其他的請求,而后端的應(yīng)用的處理只需要執(zhí)行隊(duì)列里面的就可以了,這樣請求處理和后端應(yīng)用是異步的.當(dāng)后端處理完,到全局地方得到現(xiàn)場,產(chǎn)生響應(yīng). 這個(gè)就實(shí)現(xiàn)了異步處理。
BIO就是一個(gè)連接一個(gè)線程
NIO就是一個(gè)請求一個(gè)線程
Async就是一個(gè)有效請求一個(gè)線程
希望通過本文的閱讀,能夠給你帶來幫助。
【編輯推薦】