小插曲——NIO的前世今生
發展:
BIO -> NIO -> AIO
BIO就是我們傳統意義上的IO,它的特點是阻塞的。例如以前我們進行網路程式設計時,一個客戶端使用一個執行緒來進行處理。這樣會導致一個問題:伺服器的執行緒數是有限制的,而不是每個客戶端時時都有資料進行傳輸的。所以大量空的執行緒佔了位置,但是又不工作,導致伺服器的效能受限。
這會涉及到4次上下文切換和4次拷貝。
第一次切換: 從使用者態切換到核心態,將資料讀取到核心
第二次切換: 從核心態切換到使用者態,讀取返回
第三次切換: 從使用者態切換到核心態,將資料拷貝到核心
第四次切換: 從核心態切換到使用者態,寫完返回
四次拷貝:
1.通過DMA將資料從硬體拷貝到核心
2.通過CPU將資料從核心拷貝到使用者緩衝
3.通過CPU將資料從使用者緩衝拷貝到核心
4.從核心寫入到硬體
NIO: 一個請求對應一個執行緒,解決BIO高併發的問題。
會涉及到3次 拷貝,2次 切換:
第一次拷貝: 從硬體到核心空間
第二次拷貝:從核心空間到socket buffer
第三次拷貝: 從socket buffer到protocol engine
第一次切換: 從使用者態切換到核心態,資料通過DMA將資料拷貝到核心
第二次切換: 資料寫完到硬體後返回,從核心態切換到使用者態
BIO和NIO對比:
BIO基於流,而NIO基於 Buffer. BIO 只能按照順序讀,而NIO可以隨意讀。
感謝支援,我會更加努力分享,喜歡的朋友可以關注下專欄:Java架構技術進階 。裡面有大量batj面試題集錦,還有各種技術分享,如有好文章也歡迎投稿哦。