Netty支持哪些I/O模式?
1 經(jīng)典I/O模式
BIO (阻塞I/O) | JDK1.4前 |
---|---|
NIO (非阻塞 I/O) | JDK1.4 (2002 年,java.nio 包) |
AIO(異步 I/O) | JDK1.7 (2011 年) |
1.2 對比概念
阻塞與非阻塞
數(shù)據(jù)就緒前要不要等待?
- 阻塞
沒有數(shù)據(jù)傳過來時,讀會阻塞直到有數(shù)據(jù);緩沖區(qū)滿時,寫操作也會阻塞
- 非阻塞
直接返回
同步與異步
數(shù)據(jù)就緒后,數(shù)據(jù)操作誰完成?
- 需要自己去讀是同步
- 數(shù)據(jù)就緒直接讀好再回調(diào)給程序是異步
2 Netty 對三種 IO 的支持變遷
劃線的已不再支持了哦!
為什么廢除阻塞I/0 (BIO/OIO) ?
連接數(shù)高的情況下:阻塞 -> 耗資源、效率低。
阻塞意味著等待,等待就會一直占用該線程,當(dāng)連接數(shù)高時,大多線程又在等待,就會耗盡系統(tǒng)的線程資源。
為什么刪掉已經(jīng)做好的AIO支持?
- Windows實現(xiàn)成熟,但其很少用做服務(wù)器
- Linux常用做服務(wù)器,但其AlO實現(xiàn)不夠成熟
- Linux下AIO相比較NIO的性能提升不明顯
所以 netty 也是聯(lián)系實際情況才有選擇地支持高性能的 IO 模式。
為什么 Netty 支持多種實現(xiàn)?
通用NIO實現(xiàn)(Common)在Linux下也是epoll,但Netty依舊選擇自己實現(xiàn),因為更好:
Netty提供更多可控參數(shù):
- JDK的NIO默認(rèn)實現(xiàn)是水平觸發(fā)
- Netty 是邊緣觸發(fā)(默認(rèn))和水平觸發(fā),且可切換
Netty實現(xiàn)的垃圾回收更少、性能更好
NIO 一定優(yōu)于 BIO?
BIO 代碼簡單且在特定場景:連接數(shù)少,并發(fā)度低,BIO 性能不輸NIO。當(dāng)然考慮業(yè)務(wù)發(fā)展后期都是復(fù)雜場景了,所以 Netty 只考慮 NIO。
本文轉(zhuǎn)載自微信公眾號「JavaEdge」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系JavaEdge公眾號。