常見JAVA中IO/NIO模型有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創新互聯建站專注于靈壽網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供靈壽營銷型網站建設,靈壽網站制作、靈壽網頁設計、靈壽網站官網定制、微信小程序服務,打造靈壽網絡公司原創品牌,更為您提供靈壽網站排名全網營銷落地服務。我們常見的IO模型有:阻塞 IO 模型、非阻塞 IO 模型、多路復用 IO 模型、 信號驅動 IO 模型、異步 IO 模型;下面我們就簡單介紹一下以上IO模型。
1、阻塞 IO 模型
最傳統的一種IO 模型,即在讀寫數據過程中會發生阻塞現象。當用戶線程發出IO 請求之后,內核會去查看數據是否就緒,如果沒有就緒就會等待數據就緒,而用戶線程就會處于阻塞狀態,用戶線程交出CPU。當數據就緒之后,內核會將數據拷貝到用戶線程,并返回結果給用戶線程,用戶線程才解除block 狀態。典型的阻塞IO 模型的例子為:data = socket.read();如果數據沒有就緒,就會一直阻塞在read 方法。
2、非阻塞 IO 模型
當用戶線程發起一個read 操作后,并不需要等待,而是馬上就得到了一個結果。如果結果是一個error 時,它就知道數據還沒有準備好,于是它可以再次發送read 操作。一旦內核中的數據準備好了,并且又再次收到了用戶線程的請求,那么它馬上就將數據拷貝到了用戶線程,然后返回。所以事實上,在非阻塞IO 模型中,用戶線程需要不斷地詢問內核數據是否就緒,也就說非阻塞IO不會交出CPU,而會一直占用CPU。典型的非阻塞IO 模型一般如下:
while(true){ data = socket.read(); if(data!= error){ 處理數據 break; } }
但是對于非阻塞IO 就有一個非常嚴重的問題,在while 循環中需要不斷地去詢問內核數據是否就緒,這樣會導致CPU 占用率非常高,因此一般情況下很少使用while 循環這種方式來讀取數據。
3、多路復用 IO 模型
多路復用IO 模型是目前使用得比較多的模型。
Java NIO 實際上就是多路復用IO。在多路復用IO模型中,會有一個線程不斷去輪詢多個socket 的狀態,只有當socket 真正有讀寫事件時,才真正調用實際的IO 讀寫操作。
因為在多路復用IO 模型中,只需要使用一個線程就可以管理多個socket,系統不需要建立新的進程或者線程,也不必維護這些線程和進程,并且只有在真正有socket 讀寫事件進行時,才會使用IO 資源,所以它大大減少了資源占用。
在Java NIO 中,是通過selector.select()去查詢每個通道是否有到達事件,如果沒有事件,則一直阻塞在那里,因此這種方式會導致用戶線程的阻塞。
多路復用IO 模式,通過一個線程就可以管理多個socket,只有當socket 真正有讀寫事件發生才會占用資源來進行實際的讀寫操作。因此,多路復用IO 比較適合連接數比較多的情況。
另外多路復用IO 為何比非阻塞IO 模型的效率高是因為在非阻塞IO 中,不斷地詢問socket 狀態時通過用戶線程去進行的,而在多路復用IO 中,輪詢每個socket 狀態是內核在進行的,這個效率要比用戶線程要高的多。
不過要注意的是,多路復用IO 模型是通過輪詢的方式來檢測是否有事件到達,并且對到達的事件逐一進行響應。因此對于多路復用IO 模型來說,一旦事件響應體很大,那么就會導致后續的事件遲遲得不到處理,并且會影響新的事件輪詢。
4、信號驅動 IO 模型
在信號驅動IO 模型中,當用戶線程發起一個IO 請求操作,會給對應的socket 注冊一個信號函數,然后用戶線程會繼續執行,當內核數據就緒時會發送一個信號給用戶線程,用戶線程接收到信號之后,便在信號函數中調用IO 讀寫操作來進行實際的IO 請求操作。
5、異步 IO 模型
異步IO 模型才是最理想的IO 模型,在異步IO 模型中,當用戶線程發起read 操作之后,立刻就可以開始去做其它的事。
而另一方面,從內核的角度,當它受到一個asynchronous read 之后,它會立刻返回,說明read 請求已經成功發起了,因此不會對用戶線程產生任何block。
然后,內核會等待數據準備完成,然后將數據拷貝到用戶線程,當這一切都完成之后,內核會給用戶線程發送一個信號,告訴它read 操作完成了。也就說用戶線程完全不需要實際的整個IO 操作是如何進行的,只需要先發起一個請求,當接收內核返回的成功信號時表示IO 操作已經完成,可以直接去使用數據了。
也就說在異步IO 模型中,IO 操作的兩個階段都不會阻塞用戶線程,這兩個階段都是由內核自動完成,然后發送一個信號告知用戶線程操作已完成。用戶線程中不需要再次調用IO 函數進行具體的讀寫。
這點是和信號驅動模型有所不同的,在信號驅動模型中,當用戶線程接收到信號表示數據已經就緒,然后需要用戶線程調用IO 函數進行實際的讀寫操作;而在異步IO 模型中,收到信號表示IO 操作已經完成,不需要再在用戶線程中調用IO 函數進行實際的讀寫操作。
注意,異步IO 是需要操作系統的底層支持,在Java 7 中,提供了Asynchronous IO。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯成都網站設計公司行業資訊頻道,感謝您對創新互聯成都網站設計公司的支持。
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網頁標題:常見JAVA中IO/NIO模型有哪些-創新互聯
分享URL:http://vcdvsql.cn/article14/dsdhge.html
成都網站建設公司_創新互聯,為您提供軟件開發、外貿建站、用戶體驗、微信小程序、網站設計公司、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯