就速度來說 CPU > 內存 > 硬盤
I
- 就是從硬盤到內存O
- 就是從內存到硬盤
第一種方式:我從硬盤讀取數據,然后程序一直等,數據讀完后,繼續操作。這種方式是最簡單的,叫阻塞IO。
第二種方式:我從硬盤讀取數據,然后程序繼續向下執行,等數據讀取完后,通知當前程序(對硬件來說叫中斷,對程序來說叫回調),然后此程序可以立即處理數據,也可以執行完當前操作在讀取數據。
在以前的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。
還有一種就是同步 IO 和異步 IO。經常說的一個術語就是“異步非阻塞”,好象異步和非阻塞是同一回事,這大概是一個誤區吧。
至於 Java NIO 的 Selector,在舊的 Java IO 系統中,是基於 Stream 的,即“流”,流式 IO。
當程序從硬盤往內存讀取數據的時候,操作系統使用了 2 個“小伎倆”來提高性能,那就是預讀,如果我讀取了第一扇區的第三磁道的內容,那么你很有可能也會使用第二磁道和第四磁道的內容,所以操作系統會把附近磁道的內容提前讀取出來,放在內存中,即緩存。
(PS:以上過程簡化了)
通過上面可以看到,操作系統是按塊 Block從硬盤拿數據,就如同一個大臉盆,一下子就放入了一盆水。但是,當 Java 使用的時候,舊的 IO 確實基於 流 Stream的,也就是雖然操作系統給我了一臉盆水,但是我得用吸管慢慢喝。
於是,NIO 橫空出世。