文章目录一、BIO1.1 存在的问题——过程阻塞1.2 两种解决方案1.3 不足二、NIO2.1 select2.2 poll2.3 epoll2.4 总结三、AIO补充知识——同步与异步同步和异步的区别最大在于异步的话调用者不需要等待处理结果被调用者会通过回调等机制来通知调用者其返回结果。同步 同步就是发起一个调用后被调用者未处理完请求之前调用不返回。异步 异步就是发起一个调用后立刻得到被调用者的回应表示已接收到请求但是被调用者并没有返回结果此时我们可以处理其他的请求被调用者通常依靠事件回调等机制来通知调用者其返回结果。补充知识——阻塞和非阻塞阻塞 调用者发起一个请求期间一直等待请求结果返回无法从事其他任务只有当条件就绪才能继续。非阻塞调用者发起一个请求调用者不用一直等着结果返回期间可以去干其他事情。补充知识——同步阻塞、同步非阻塞和异步非阻塞的区别同步阻塞客户端等着服务器执行完任务期间不能干其他事。BIO同步非阻塞客户端在服务器执行完任务期间能去干其他事每隔一段时间就来看看服务器是否执行完任务。异步非阻塞客户端在服务器执行任务期间能去干其他事期间也不用查看服务器是否执行完因为服务器执行完后会自己通知其他线程。参考博客BIO 是同步阻塞通信AIO 是彻底的异步通信。NIO 是同步非阻塞通信。有一个经典的举例。烧开水。场景有一排水壶客户在需要烧水。AIO的做法是每个水壶上装一个开关当水开了以后会提醒对应的线程去处理。类似MQ的生产者NIO的做法是叫一个线程不停的循环观察每一个水壶根据每个水壶当前的状态去处理。类似定时任务Job或者循环BIO的做法是叫一个线程停留在一个水壶那直到这个水壶烧开才去处理下一个水壶。类似 锁的等待一、BIO BIOBlocking I/O同步阻塞IO。最开始的网络通信就是BIO模型服务端创建一个ServerSocket客户端创建一个 Socket 去连接服务端这样客户端与服务端便可以进行通信了。1.1 存在的问题——过程阻塞服务端需要一直等待客户端的连接请求当客户端连接之后服务器在处理客户端请求时客户端只能进行等待如果客户端暂时没有请求服务器将再次进入阻塞状态。1.2 两种解决方案使用多线程每连接一个客户端时服务端便创建一个线程来专门处理该客户端的请求主线程则继续等待其他客户端的连接请求。使用线程池不需要对每一个请求都创建线程只需要去线程池中取一个线程即可。可是底层的通信机制依然是同步阻塞的所以又被称为伪异步IO。1.3 不足开启大量线程需要消耗大量的内存资源而且线程之间频繁的切换会降低程序的性能。并且当请求的客户端特别多时可能会因为开销过大导致系统崩溃。二、NIO文件描述符fd(File Descriptor)是计算机科学中术语形式上是一个非负整数。当程序打开一个现有文件或者创建一个新文件时内核向进程返回一个文件描述符。知识补充——多路复用是指一个进程来监视多个网络连接的描述符一旦某一个客户端的文件描述符就绪就能通知相应的程序进行处理。NIONon Blocking I/O同步非阻塞IO。实现NIO需要通过I/O的多路复用。多路复用有 select、poll、epoll 这三种机制可以同时监控多个fd的操作任何一个返回内核数据就绪应用进程再发起recvfrom系统调用。2.1 select当有客户端连接服务器时服务器会为每一个客户端随机创建一个不同的文件描述符。select模型首先将所有的文件描述符收集到 bitmap 集合中然后将集合从用户态拷贝到内核态让内核判断哪一个文件描述符有数据。当有客户端发来请求对应客户端的文件描述符将会被置位select 函数将会被返回程序则从阻塞状态解除继续执行之后的代码2.2 poll看不懂略2.3 epoll看不懂略2.4 总结三、AIOBIONIO在数据从内核复制到应用缓冲的时候都是阻塞的因此都不是真正的异步。AIO才是异步非阻塞的。AIOAsynchronous I/O异步非阻塞IO。当通过AIO发起IO操作时程序不需要阻塞等待底层执行完可以继续执行接下来的操作。当IO操作结束后操作系统会回调你设置的接口“IO操作已完成”异步。