Linux I/O model
- blocking I/O
- non blocking I/O
- I/O multiplexing (select and poll)
- signal driven I/O (SIGIO)
- asynchronous I/O (the POSIX aio_ functions)
Chapter 6. I/O Multiplexing: The select and poll Functions
JAVA 实现
JAVA 最早实现是 IO 是 blocking I/O, 是面向流的,每次从流中读一个或多个字节,直至读取所有字节,没有被缓存在任何地方,且它不能前后移动流中的数据。之后推出的 NIO 是 non blocking I/O,是面向缓冲区的,数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。同时,借助于 Selectors,它还可以实现 I /O multiplexing,即 reactor 模式。之后的 NIO 2.0 又引入了 asynchronous I/O,对应的可以实现 Proactor 模式。
zero copy
Java NIO 中提供的 FileChannel 拥有 transferTo 和 transferFrom 两个方法,可直接把 FileChannel 中的数据拷贝到另外一个 Channel,或者直接把另外一个 Channel 中的数据拷贝到 FileChannel。该接口常被用于高效的网络 / 文件的数据传输和大文件拷贝。在操作系统支持的情况下,通过该方法传输数据并不需要将源数据从内核态拷贝到用户态,再从用户态拷贝到目标通道的内核态,同时也避免了两次用户态和内核态间的上下文切换,也即使用了“零拷贝”,所以其性能一般高于 Java IO 中提供的方法。
Java 进阶(五)Java I/ O 模型从 BIO 到 NIO 和 Reactor 模式