一、BIO(Blocking I/O) BIO,同步阻塞IO模型,應用程式發起系統調用後會一直等待數據的請求,直至內核從磁碟獲取到數據並拷貝到用戶空間; 在一般的場景中,多線程模型下的BIO是成本較低、收益較高的方式。但是,如果在高併發的場景下,過多的創建線程,會嚴重占據系統資源,降低系統對外界響應 ...
一、BIO(Blocking I/O)
BIO,同步阻塞IO模型,應用程式發起系統調用後會一直等待數據的請求,直至內核從磁碟獲取到數據並拷貝到用戶空間;
在一般的場景中,多線程模型下的BIO是成本較低、收益較高的方式。但是,如果在高併發的場景下,過多的創建線程,會嚴重占據系統資源,降低系統對外界響應效率。即使使用線程池,只能一定程度上緩解了頻繁調用IO介面帶來的資源占用。
二、NIO(Non-Blocking/New I/O)
NIO,JAVA中與JDK1.4引入該IO模型,但不要簡單的理解為同步非阻塞,JAVA中的NIO實際上可以看作IO多路復用模型,下麵簡單介紹下這兩種I/O模型。
2.1 同步非阻塞模型
應用程式向內核發起請求後,即使kernel沒有從磁碟中取到數據,也會返回一個結果給用戶,用戶判斷結果正確性,如果不是需要的數據,則後續繼續發起請求,即輪詢請求,直至kernel取到數據並返回。
採用輪詢方式,會導致系統上下文切換開銷很大,會大幅度推高CPU占用率。
2.2 IO多路復用模型
Java 中的 NIO ,有一個非常重要的選擇器 ( Selector ) 的概念,也可以被稱為 多路復用器。通過它,只需要一個線程便可以管理多個客戶端連接。當客戶端數據到了之後,才會為其服務。線程首先發起 select 調用,詢問內核數據是否準備就緒,等內核把數據準備好了,用戶線程再發起 read 調用。
IO 多路復用模型,通過減少無效的系統調用,減少了對 CPU 資源的消耗,解決了同步阻塞I/O和同步非阻塞I/O的問題,是一種非常高效的I/O模型。
三、AIO(Asynchronous I/O)
AIO,非同步IO模型,也叫NIO2,JAVA7中引入,非同步 IO 是基於事件和回調機制實現的,也就是應用操作之後會直接返回,不會堵塞在那裡,當後臺處理完成,操作系統會通知相應的線程進行後續的操作。
四、幾種常見IO模型的對比
圖片來自【美團技術團隊】https://tech.meituan.com/2016/11/04/nio.html ,其中也詳細闡述了NIO模型,可前往學習。