Unix和Java模型1、同步和异步概念:对于接口调用、服务调用、API类库调用等同步,用户可以使用此接口的设备,如下图所示这就是“同步”。
异步所谓的“异步”,是指这个调用者在调用接口后立即返回,即使他做了别的事情,该接口的磁盘读写和网络通信是否成功然后,在这个接口之后做了自己的任务,比如写了文件或者做了什么,反而让调用者知道那个调用成功了。 可以使用几种内部通信机制或回调函数进行通知,如下图所示。
2、屏蔽和无屏蔽:以底层IO操作阻塞为对象。 例如,目前,我们的程序试图通过网络读取数据。 在阻断IO模式的情况下,如果向OS内核发出请求,想要从网络读取数据,则在那里将被阻断,必须等到网络上的数据到达。 从网络读取数据并返回内核,然后如下图所示从内核返回程序。
非阻塞:程序向内核发送请求,从网络读取数据,但此时网络中的数据还没有到达。 此时不会屏蔽。 内核向程序返回异常消息。 程序可以通过做其他事情访问内核,检查是否读取了所请求的数据。 下图:
3、BIO,NIO和AIO BIO
主要是同步块IO模型,在Java中称为BIO,早于JDK1.4。 在Java代码中调用与IO相关的接口并启动IO操作时,Java程序将同步等待。 此同步是指Java程序调用IO API接口的级别。
另一方面,IO API的底层I/o操作基于向操作系统内核发送I/o请求的块I/o。 在数据到达之前,系统内核不会执行I/o操作,而是在执行完成之前返回
NIO
在JDK 1.4之后提供了NIO。 他的概念是同步无阻塞。 这意味着,当调用NIO接口执行IO操作时,实际上会等待同步,而底层IO操作会向系统内核发出无阻塞IO请求,并以无阻塞的形式执行IO。
这意味着,如果缺少底层数据,内核将返回异常消息,且不会被阻止,但在NIO接口内部,它将以非阻止方式重新调用内核一段时间,直到成功,然后重新启动IO请求。
但是,这里的“同步”是指在Java代码调用NIO接口的级别进行同步,因此在基本IO操作实际完成之前无法同步返回。 但是,执行基本IO时以非阻塞方式执行
NIO网络通信与IO多路复用模型
事实上,在基于NIO进行网络通信时,采用多路复用的IO模型,该多路复用的IO模型以网络通信中的IO场景为对象。
简单地说,在基于套接字进行网络通信时,如果多个客户端与服务器端建立了套接字连接,则需要维护多个套接字连接。
复用IO模型意味着Java代码直接由select函数调用,直接等待同步。
所以,NIO一定是“同步”的。 因为您必须等待请求到达在此同步的套接字连接。
然后同步等待select函数轮询多个底层套接字连接。 如果不断检查每个套接字连接是谁请求到达的,select函数就会返回,让我们的Java程序处理。
select函数在底层以无阻塞方式轮询每个套接字,如果数据无法到达其中一个套接字,无阻塞特性会立即返回消息。
然后,由于select函数可以轮询下一个套接字,并且在一个套接字上没有阻塞,基础基于该去阻塞模式“监视”谁有数据到达每个套接字。
这就是所谓的“同步无阻塞”,这种模型称为“IO复用”模型,因为操作系统可以将所有上述工作封装在一个select函数调用中,同时监视多套接字连接。
在这样的IO复用模型中,可以在一个线程中调用一个select函数来监视连接了许多客户端,如下图所示
AIO
最后,在JDK 1.7之后,支持了AIO。 也称为NIO 2.0,支持异步IO模型。
首先,让我解释一下异步IO模型是什么意思。
简单地说,你的Java程序可以基于AIO API提出请求。 例如,收到网络数据后,AIO API的基础基于异步IO模型调用操作系统内核。
此时不需要管理这个IO是否成功。 AIO接口直接返回,你的Java程序也直接返回。
之后,你的Java程序可以做别的事情。 这里为什么称为异步,可以理解为联想到上述异步的例子。
由于BIO、NIO已同步,因此要启动IO请求,必须同步等待IO操作完成。
但是,在这里你提出IO请求,AIO接口就会直接返回,你可以做别的。 是纯粹的异步方式。
但是,您必须为AIO接口提供回调函数。 当底层系统内核完成特定的IO请求(例如读写网络等)时,将回调提供的回调函数。
例如,通过网络读取数据时,AIO接口会将操作系统异步读取的数据传递给回调函数。 下图: