IO中的同步和异步:
同步阻塞:io操作是由应用程发起和进行的,操作系统听候应用程指挥,例如应用程序进行read后操作系统就会进行read操作。
表现为必须收到io操作的结果后线程才能继续向下执行,当前cpu只能等到内核态读写完毕,才能进行其它操作。
同步非阻塞:cpu不用等待当前内核态读写完毕,可以去执行其它的线程,但是在此期间需要不断轮询内核态读写操作是否完成。
异步非阻塞:io操作是由应用程序发起,但是由操作系统去执行的,即分配给了操作系统这个io任务之后,cpu执行其它线程,不会等待io操作的返回结果,当操作系统执行完io操作后就会通知应用程:您分配给我的io任务我已经做完了 。
BIO(同步阻塞):传统的java.io包下的字节输入输出流。
缺点:当read或者write容易阻塞,例如当内核缓冲区为空时读数据或者内核缓冲区满时写数据,会发生阻塞,这时候线程就会阻塞,知道读操作或者写操作成功线程才会继续执行。可以使用线程池优化。
NIO(同步不阻塞):在网络传输中,有请求才创建线程,没有请求时,线程就可以做其它的事情,例如处理其它有请求的连接。
NIO 是一种同步非阻塞的 I/O 模型,于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 NIO 提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。
(AIO)异步非阻塞的方式:
在网络传输中,将io操作交给操作系统去执行,当io操作完成后,会返回一个io操作成功的信号,这时候才会创建线程,,其它时间线程可以处理其它的连接,和同步不阻塞的区别是不会多次试探了,操作系统完成后会返回信号通知应用程序。
网络传输-服务器端:
BIO:一个连接就创建一个线程,即无论有没有请求都创建一个线程。
NIO:一个有请求的连接对应一个线程,需要应用层试探。
AIO:,即操作系统完成io操作后才创建对应线程,不用应用层自己试探。