IO同步异步/阻塞非阻塞

同步和异步:当前线程是否需要等待方法调用执行完毕。

阻塞和非阻塞:当前接口数据还未准备就绪时,线程是否被阻塞挂起

同步和异步其实是处理框架这种高层次维度 来看待问题的,而阻塞和非阻塞往往是针对底层的系统调用方法来抉择,两者是从不同维度来考虑的。

这四个概念两两组合,会形成4个概念,如下:

同步阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端帽被服务端阻塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接受其他客户端的请求,这种通信机制比较简单粗暴,但是效率不高。

同步非阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵塞,所以这是非阻塞的。

异步阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务响应,它可以 做其他的任务,等服务器处理完毕后再把结果响应给客户端,客户端得到回调后再处理服务端的响应。这种方式可以避免客户端一直处理等待状态,优化了用户体验,其实就是类似于见面里发起ajax异步请求。

异步非阻塞:客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候任务虽然处理时间很久,但是客户端可以做其他任务,因为他是异步的,可以在回调函数里处理响应,同时服务羰是非阻塞的,所以服务端可以去处理自己的任务,如此,这个模式就非常高效了。

BIO:同步阻塞

BIO,服务器实现一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,没处理完当前线程不能做其他操作(如果是单线程的情况下,我传输的文件很大呢)当然可以通过线程池机制改善。

BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO:同步非阻塞

NIO服务器实现一个连接一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时启动一个线程进行处理。

NIO方式适用于连接数目多且比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4之后开始支持。

AIO:异步非阻塞

AIO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器去启动线程进行处理,AIO方式使用于连接数目多且连接比较长(重操作)的架构,如相册服务器,充分调用操作系统参与并发操作,编程比较复杂,JDK1.7之后开始支持。

AIO属于NIO包中的类实现,其实IO主要分为BIO和NIO,AIO只是附加器,解决IO不能异步的实现在以前很少有linux系统把持AIO,windows的IOCP就是该AIO模型,但是现在服务器一般都是支持AIO操作的

相关推荐
linux kernel24 分钟前
第六部分:数据链路层
服务器·网络
侠客行03176 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪6 小时前
深入浅出LangChain4J
java·langchain·llm
较劲男子汉8 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
灰子学技术8 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚8 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
wypywyp8 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
风流倜傥唐伯虎8 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰8 小时前
[python]-AI大模型
开发语言·人工智能·python
Doro再努力8 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim