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