Java IO - Rosscqu/toBeBigDataer GitHub Wiki
1 Linux网络I/O模型
Linux的内核将所有外部设备看作文件来操作,对一个文件的读写操作会调用内核提供的命令返回一个file descriptor(文件描述符)。对一个socket的读写会有相应的描述符socket fd(socket描述符),描述符适合数字,指向内核中的一个结构体(文件路径、数据区等属性)。
unix提供的I/O模型有: ● 阻塞I/O模型 ● 非阻塞IO模型 ● IO复用模型:select/poll、epoll ● 信号驱动IO模型 ● 异步IO模型
参考《UNIX网络编程》
2 IO多路复用技术
背景:需要同时处理多个客户端请求时,可以利用多线程或IO多路复用技术进行处理。 IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端的请求。 应用场景: ● 服务器需要同时处理多个处于监听状态或者多个连接状态的套接字; ● 服务器需要同时处理多种网络协议的套接字
支持IO多路复用的系统调用有select、pselect、poll、epoll,过去一般使用select做轮询和网络事件通知,因为其缺点,目前一般采用epoll。epoll的优点:
- 支持一个进程打开的socket描述符不受限制(仅受限与操作系统的最大文件句柄数);
- IO效率不会随着FD数目的增加而线性下降:select/poll会线性扫描socket集合
- 使用mmap加速内核与用户空间的消息传递
- epoll的API更加简单
3 Java的IO演变
- JDK1.4之前:BIO(同步阻塞IO)
- JDK1.4:NIO(提供异步IO操作、非阻塞IO操作)
- JDK1.7:升级NIO(提供AIO能力,支持基于文件的异步IO操作和针对网络套接字的异步操作)
网络编程的基本模型是client/server模型,就是两个进程之间进行相互通信,其中服务端提供服务,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方可以通过网络套接字进行通信。
3.1 BIO通信模型
BIO提供了Socket类和ServerSocket类。
3.2 伪异步IO
3.3 NIO通信模型
NIO提供了SocketChannel类和ServerSocketChannel类,这两个类支持阻塞和非阻塞两种模式。对于低负载、低并发的应用程序可以选择阻塞模式,对于高负载、高并发的选择非阻塞模式。 NIO的类库有:
- 缓冲区buffer类
- 通道channel类
- 多路复用器Selector类