什么是socket?什么是IO/NIO/BIO/AIO?区别是什么?
时间: 2023-03-21 12:01:19 浏览: 482
Socket是应用层与网络层之间的一个抽象层,用于实现网络通信。
IO(Input/Output)是指程序与外部世界交互的方式,包括从输入设备(如键盘、鼠标)读取数据和向输出设备(如屏幕、打印机)写入数据。NIO(Non-Blocking I/O)、BIO(Blocking I/O)和AIO(Asynchronous I/O)是Java中对IO操作的不同实现方式。
BIO是同步阻塞式IO,即当一个线程在进行IO操作时,如果数据没有准备好,那么该线程会一直阻塞等待数据准备好后再继续执行。
NIO是同步非阻塞式IO,即一个线程可以同时处理多个IO操作,当数据没有准备好时,该线程可以继续处理其他的IO请求,不会阻塞等待数据准备好。
AIO是异步非阻塞式IO,即IO操作的完成不需要线程等待,操作系统会在数据准备好后通知线程进行后续处理。
总体来说,BIO适用于连接数比较小且固定的架构,NIO适用于连接数比较多且连接比较短的架构,AIO适用于连接数较多且每个连接的数据交换量比较大的架构。
相关问题
tomcat是NIO AIO BIO
Tomcat是一个流行的Web服务器,可以用于Java Web应用程序的部署和运行。Tomcat默认使用BIO(Blocking IO)模型来处理客户端请求,但是它也支持使用NIO(Non-blocking IO)和AIO(Asynchronous IO)模型。
BIO是一种同步的I/O模型,即当一个线程在执行I/O操作时,该线程会阻塞直到I/O操作完成,而其他线程则会被阻塞,等待I/O操作完成后才能继续执行。在Tomcat中,BIO模型使用的是Java的Socket类,它提供了InputStream和OutputStream来进行读写操作。
NIO是一种基于事件驱动的I/O模型,它可以在一个线程中同时处理多个客户端请求。在Tomcat中,NIO模型使用的是Java的NIO库,它提供了Channel和Buffer来进行读写操作。
AIO是一种异步的I/O模型,它可以在I/O操作完成之前继续执行其他任务,当I/O操作完成后会通知程序进行处理。在Tomcat中,AIO模型使用的是Java的NIO库中的AsynchronousSocketChannel和CompletionHandler来进行异步读写操作。
总之,Tomcat支持多种I/O模型,可以根据具体的应用场景和需求选择最合适的模型。
NIO、BIO、AIO
NIO(Non-Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,线程在读写IO期间不能干其他事情,而NIO中可以配置socket为非阻塞模式。NIO相关类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写。NIO有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)。[1]
BIO(Blocking I/O)是同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。Java中的BIO分为传统BIO和伪异步IO。传统BIO是一请求一应答的模式,而伪异步IO通过线程池固定线程的最大数量来防止资源的耗费。[3]
AIO(Asynchronous IO)是Java 7中引入的NIO的改进版,也被称为NIO 2。AIO是异步非阻塞的IO模型,它是基于事件和回调机制实现的。在AIO中,应用操作之后会直接返回,不会阻塞在那里,当后台处理完成后,操作系统会通知相应的线程进行后续的操作。[2]
综上所述,NIO是非阻塞IO,BIO是同步阻塞IO,而AIO是异步非阻塞IO。它们分别适用于不同的场景和需求。
阅读全文