天天看点

I/O模型和Java的三种I/O的区别I/O模型和Java的三种I/O的区别

I/O模型和Java的三种I/O的区别

一、I/O模型:

1、阻塞I/O模型:

  最常用的I/O模型就是阻塞I/O模型,缺省情形下,所有文件操作都是阻塞的。在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直会等待,进程在从调用recvfrom开始到它返回到整段时间内都是被阻塞的,因此被称为阻塞I/O模型。

2、非阻塞I/O模型:

3、I/O复用模型

4、信号驱动I/O模型

5、异步I/O

二、BIO、NIO、AIO的区别:

  网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。

  在基于传统同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口,Socket负责发起连接操作,连接成功之后,双方通过输入和输出流进行同步阻塞式通信。

  BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成孩子会,通过输出流返回应答给客户端,线程销毁。

  BIO模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程个数和客户端并发访问数呈1:1的正比关系,由于线程是Java虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

三、NIO开发的难点

  开发NIO服务端,需要能够处理网络的闪断、客户端的重复接入、客户端的安全认证、消息的编解码、半包都写、失败缓存、网络拥塞、异常码流等情况。