我们在平常开发过程中接触最多的就是 磁盘 IO(读写文件) 和 网络 IO(网络请求和响应)。
从应用程序视角来看,我们的应用程序对操作系统的内核发起IO调用(系统调用),操作系统负责的内核执行具体IO操作。
UNIX系统下,IO模型有五种:同步阻塞IO、同步非阻塞IO、IO多路复用、信号驱动IO和异步IO。
阻塞与非阻塞指的的是当不能进行读写(网卡满时的写/网卡空的时候的读)的时候,I/O 操作立即返回还是阻塞。
同步异步指的是,当数据已经就绪的时候,读写操作是同步读还是异步读,他们的阶段不同而已。
Java中三种常见IO模型
BIO
BIO属于同步阻塞IO模型,应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间。
NIO
Java的NIO是1.4引入的,提供了channel、selector、buffer等抽象,它是面向缓冲区,基于管道的的操作方法。
应用程序会一直发起read调用,等待数据从内核空间拷贝到用户空间的这段时间,线程依然是阻塞的,直到内核把数据拷贝到用户空间。
他通过轮询操作,避免了一直阻塞,但是不断的调用是很消耗CPU资源。这时可以使用IO多路复用模型,线程首
先发起select调用,询问内核数据是否就绪,等内核把数据准备好,用户线程再发起read调用。read调用的过程
(数据从内核到用户)还是阻塞的。IO多路复用模型通过减少无效的系统调用,减少了对CPU资源的消耗。
Java中的NIO还有一个selector,也就是多路复用器,只需要一个线程就可以管理多个客户端连接。客户端数据到达才会处理。
AIO
异步IO模型,异步IO基于事件和回调机制实现,应用发起调用后立刻返回,当处理完成后,操作系统会通知应用。
Re
JavaGuide