NIO,全称non-blocking IO,由jdk1.4推出,它是一种非阻塞的IO方式,为所有的基本类型提供了缓存支持。
IO操作包括,对硬盘的读写,对socket的读写及外设的读写。
阻塞和非阻塞
阻塞:当某个事件或任务执行过程中,它发出一个请求操作,当该请求所需的条件不满足时,该事件会一直停留在这里,等待直到条件满足。
非阻塞:当某个事件或任务执行过程中,它发出一个请求操作,当该请求所需的条件不满足时,会立即返回一个标志信息告知条件不满足,不会一直等待条件满足。
阻塞IO和非阻塞IO
当用户发起一个IO请求操作,内核会去查看要读取的数据是否就绪。
对于阻塞IO,如果数据没有准备就绪,就一直等待知道数据就绪。
对于非阻塞IO来说,如果数据没准备就绪,就返回一个标识信息告诉用户线程当前的数据没有准备就绪。数据准备就绪后,便将数据拷贝到用户线程,完成一整个完整的IO请求操作。
完整的IO请求包括两个阶段:
1)查看数据是否就绪
2)进行数据拷贝(内核将数据拷贝到用户线程)
阻塞IO和非阻塞IO区别在于第一个阶段,没有数据的时候是一直等待还是返回一个标志信息。
同步IO和异步IO:
从字面的意思可以看出:同步IO即 如果一个线程请求进行IO操作,在IO操作完成之前,该线程会被阻塞;
而异步IO为 如果一个线程请求进行IO操作,IO操作不会导致请求线程被阻塞。
事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。