什么是經典的三種 I/O 模式?
生活場景:
當我們去飯店吃飯時:
• 食堂排隊打飯模式:排隊在窗口,打好才走;
• 點單、等待被叫模式:等待被叫,好了自己去端;
• 包廂模式:點單后菜直接被端上桌。
• 阻塞與非阻塞
1) 菜沒好,要不要死等 -> 數據就緒前要不要等待?
2) 阻塞:沒有數據傳過來時,讀會阻塞直到有數據;緩沖區滿時,寫操作也會阻塞。
非阻塞遇到這些情況,都是直接返回。
• 同步與異步
1) 菜好了,誰端 -> 數據就緒后,數據操作誰完成?
2) 數據就緒后需要自己去讀是同步,數據就緒直接讀好再回調給程序是異步。
Netty 對三種 I/O 模式的支持如圖:
為什么 Netty 有多種 NIO 實現?
通用的 NIO 實現(Common)在 linux 下也是使用 epoll,為什么自己單獨實現?
實現得更好!
• Netty 暴露了更多的可控參數,例如:
JDK 的 NIO 默認實現是水平觸發
Netty 是邊緣觸發(默認)和水平觸發可切換
• Netty 實現的垃圾回收更少、性能更好
NIO 一定優于 BIO 么?
• BIO 代碼簡單。
• 特定場景:連接數少,并發度低,BIO 性能不輸 NIO。
Netty 如何支持三種 Reactor
什么是 Reactor 及三種版本?
生活場景:飯店規模變化
• 一個人包攬所有:迎賓、點菜、做飯、上菜、送客等;
• 多招幾個伙計:大家一起做上面的事情;
• 進一步分工:搞一個或者多個人專門做迎賓。
1. 一個人包攬所有:迎賓、點菜、做飯、上菜、送客等 -> Reactor 單線程
2. 多招幾個伙計:大家一起做上面的事情 -> Reactor 多線程模式
3. 進一步分工:搞一個或者多個人專門做迎賓 -> 主從 Reactor 多線程模式
Reactor 及三種版本 對應設計大圖(網絡上到處都有 直接拿來用哈哈)