Netty支持哪些I/O模式?
? 點擊上方“JavaEdge”,關注公眾號

1 經典I/O模式

| BIO (阻塞I/O) | JDK1.4前 |
|---|---|
| NIO (非阻塞 I/O) | JDK1.4 (2002 年,java.nio 包) |
| AIO(異步 I/O) | JDK1.7 (2011 年) |
1.2 對比概念


阻塞與非阻塞

數據就緒前要不要等待?
阻塞
沒有數據傳過來時,讀會阻塞直到有數據;緩沖區(qū)滿時,寫操作也會阻塞
非阻塞
直接返回

同步與異步

數據就緒后,數據操作誰完成?
需要自己去讀是同步
數據就緒直接讀好再回調給程序是異步

2 Netty 對三種 IO 的支持變遷

劃線的已不再支持了哦!
為什么廢除阻塞I/0 (BIO/OIO) ?

連接數高的情況下:阻塞 -> 耗資源、效率低。
阻塞意味著等待,等待就會一直占用該線程,當連接數高時,大多線程又在等待,就會耗盡系統(tǒng)的線程資源。
為什么刪掉已經做好的AIO支持?

Windows實現成熟,但其很少用做服務器
Linux常用做服務器,但其AlO實現不夠成熟
Linux下AIO相比較NIO的性能提升不明顯
所以 netty 也是聯系實際情況才有選擇地支持高性能的 IO 模式。
為什么 Netty 支持多種實現?


通用NIO實現(Common)在Linux下也是epoll,但Netty依舊選擇自己實現,因為更好:
Netty提供更多可控參數:
JDK的NIO默認實現是水平觸發(fā)
Netty 是邊緣觸發(fā)(默認)和水平觸發(fā),且可切換
Netty實現的垃圾回收更少、性能更好
NIO 一定優(yōu)于 BIO?

BIO 代碼簡單且在特定場景:連接數少,并發(fā)度低,BIO 性能不輸NIO。當然考慮業(yè)務發(fā)展后期都是復雜場景了,所以 Netty 只考慮 NIO。
往期推薦

目前交流群已有?800+人,旨在促進技術交流,可關注公眾號添加筆者微信邀請進群
喜歡文章,點個“在看、點贊、分享”素質三連支持一下~
評論
圖片
表情
