I/O 模型
阻塞 I/O 模型
进程发起I/O调用后,进程被阻塞,转到内核空间处理,整个I/O处理完毕后返回进程。
典型应用:
- 阻塞式Socket
- Java BIO
特点:
- 进程阻塞挂起不消耗CPU资源,及时响应每个操作
- 实现难度低、开发应用较容易
- 使用并发量小的网络应用开发
非阻塞 I/O 模型
进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,返回一个错误,以使得进程不被阻塞;进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。
典型应用:
- Socket(设置为NONBLOCK)
特点:
- 进程轮询调用,消耗CPU的资源
- 实现难度低、开发应用相对阻塞I/IO模式较难
- 适用并发量较小、且不需要及时响应的网络应用开发
I/O 复用模型
多个进程的I/O注册到一个复用器(select)上,然后用一个进程调用该 select,select 会监听所有注册过来的I/O。
典型应用:
- Linux:select、poll、epoll
- Java:NIO
特点:
- 专一进程解决多个进程I/O的阻塞问题,性能好;Reactor设计模式
- 实现、开发应用难度较大
- 适用高并发服务应用开发:一个进程(线程)响应多个请求
信号驱动 I/O 模型
当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。
特点:回调机制,实现、开发应用难度大
异步 I/O 模型
前4种为同步I/O操作,只有异步I/O模型是异步I/O操作。
当进程发起一个I/O操作,进程返回(不阻塞),单也不能返回结果,内核会把整个I/O处理完后,会通知进程结果。
典型应用:Java7 AIO、高性能服务器应用
特点:
- 回调机制,不阻塞,数据一步到位;Proactor模式
- 需要操作系统的底层支持,Linux 2.5 版本内核首现,2.6版本产品的内核标准特性
- 实现、开发应用难度大
- 适合高性能并发应用
PREVIOUSApplication starup process