1. IO 基礎(chǔ)
1.1. linux網(wǎng)絡(luò)IO模型
- 阻塞IO模型
- 非阻塞IO模型
- IO多路復(fù)用模型(NIO)
- 信號驅(qū)動IO模型
- 異步IO模型
1.2. IO多路復(fù)用模型
目前支持IO多路復(fù)用的系統(tǒng)調(diào)用有select
,pselect
,poll
,epoll
沛申。epoll
相對于select
特點如下:
- 支持一個進程打開的
socket
描述符(FD)不受限制(僅受限與操作系統(tǒng)的最大文件句柄數(shù))。1GB內(nèi)存大約是10W個句柄,通過cat /proc/sys/fs/file-max
查看。 - IO效率不會隨著FD數(shù)目的增加而線性下降。
select/poll
每次是線性掃描全部集合,因此會線性下降。epoll
只處理活躍的socket肪康,但如果所有的socket都活躍,epoll
并不比select/poll
高很多撩穿。 - 使用mmap加速內(nèi)核與用戶空間的消息傳遞磷支。epoll是通過和用戶空間mmap同一塊內(nèi)存實現(xiàn)。
-
epoll
的API更加簡單食寡。
2. JAVA IO演進之路
JDK1.4之前--BIO
JDK1.4--NIO以JSR-51的身份出現(xiàn)雾狈。但是所有文件操作都是同步阻塞調(diào)用,不支持文件異步讀寫操作抵皱。
JDK1.7--NIO2.0由JSR-203演進而來善榛。具體改進地方如下:
- 提供批量獲取文件屬性的API。
- 提供AIO功能呻畸,支持基于文件的異步IO和套接字的異步操作移盆。