什么是IO
IO(input/output): 从编程的角度来说,程序运行即为一个进程,IO也是将进程内数据输出至外部,外部数据输入到进程内部。其中也包含了我们用户态和内核的切换。
IO操作包含了两部分:IO调用和IO执行;IO调用是由我们进程发起,IO执行则是操作系统执行;在IO调用和IO执行之间会有一层数据缓冲区(内核缓冲区和进程缓冲区)
什么是Java NIO,BIO?
为什么会有NIO和BIO? BIO(Blocking Input OutPut) :是一种比较传统的直接面向流的IO模式,传统的Server/Client模式是基于TPR(Thread Per Request), 进程在进行进行同步IO操作的时候,代码会一直阻塞直到有可读的数据(读操作)或者直到数据能够写入(写操作);
NIO(Non BlockIng Input Output):基于reactor模式的工作方式,由Selector、Buffer、channel等核心组件组成。他将我们的IO操作事件注册到selector上,当发生特定事件系统再通知我们(selector实时监听多个通道)。NIO的本质是延迟IO操作,等到真正发生IO的时候再阻塞,而不是流打开了就一直会阻塞等待IO操作。
what's AIO? 异步非阻塞IO
Java NIO 核心概念
Channel
channel是一种双向的数据读取和写入通道,数据源可以是多种的,例如文件,socket等,但我们并不需要关心其结构。和流相似但又不同。
Buffer
主要用于NIO Channel的交互,读数据的时候从Channel读到Buffer,写数据时从Buffer写到Channel里面。
Selector
用于管理一个或者多个Channel的组件。