当前位置: 首页 > article >正文

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操作的


http://www.kler.cn/a/386469.html

相关文章:

  • 比ChatGPT更酷的AI工具
  • 如何使用ffmpeg命令行进行录屏
  • 假期增设:福祉与负担并存,寻求生活经济平衡之道
  • Axure网络短剧APP端原型图,竖屏微剧视频模版40页
  • JQuery封装的ajax
  • 算法——移除链表元素(leetcode203)
  • Flutter中的Extension关键字
  • 桥接 设计模式 软考
  • BIM 地铁站智能可视化应用
  • 简单介绍Nginx服务器的反向代理、负载均衡
  • 小柯剧场“真人秀”:如何玩转情感与竞技的双重游戏?
  • 学习记录:js算法(八十九):电话号码的字母组合
  • # 设置ubuntu为中文后,如何保留用户家目录等文件夹名为英文
  • 基于FE1.1(非FE1.1S)的HUB拓展板子 2024/11/9
  • 【力扣热题100】[Java版] 刷题笔记-160. 相交链表
  • Linux:调试器 gdb/cgdb 的使用
  • Spark的容错机制
  • 数据编排与ETL有什么关系?
  • Springboot中的单元测试该如何进行?
  • 在职场,多少人输在不懂人情世故上!这12条人情世故,你懂几条?
  • C#中日期和时间的处理
  • 15分钟学 Go 第 45 天 : 使用Docker容器
  • Leetcode 778 Swim in a Rising water
  • (十三)JavaWeb后端开发——MySQL2
  • Spring的异步详解(@Async)
  • arkUI:层叠布局(Stack)