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