• 0
  • 0
分享
  • 高性能的IO体系设计中,IO、NIO、AIO都是什么?——软件测试圈
  • 曼倩诙谐 2021-05-18 10:36:29 字数 1578 阅读 1256 收藏 0

  摘要

  在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解,什么是IO?什么是NIO?什么是AIO?要了解这些,首先要了解同步、异步、阻塞、非阻塞,然后将其结合起来,了解IO、NIO、AIO就容易多了。

  正文

  同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。

  同步/异步:数据如果尚未就绪,是否需要等待数据结果。

  阻塞/非阻塞:进程/线程需要操作的数据如果尚未就绪,是否妨碍了当前进程/线程的后续操作。

  阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket新连接建立完毕,或者数据读取、写入操作完成;而非阻塞则是不管IO操作是否结束,直接返回,相应操作在后台继续处理。

  1)IO流(同步阻塞,适用于连接数目比较小且固定的架构)

  同步并阻塞,服务器实现模式为一个连接一个线程,每个线程亲自处理io并且一直等待io的完成,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 

  IO的局限:IO是面向流的,阻塞式的,串行的一个过程。对每一个客户端的socket连接,IO都需要一个线程来处理,而且在此期间,这个线程一直被占用,直到socket关闭。在这期间,tcp的连接、数据的读取、数据的返回都是被阻塞的。也就是说这期间大量的浪费了cpu的时间片和线程占用的内存资源。

每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很 简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。

  2)NIO(同步非阻塞,适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中):三个主要组成部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)

  解释下什么是同步非阻塞:再品味一下上边的解释好吧,同步是说我这个调用没返回,等到有结果了我再返回,而非阻塞是说我这个线程被挂起来了,可以去干点别的事,一旦准备好了,我的调用再返回,明白了没。

  服务器实现模式为一个请求一个线程,每个线程亲自处理io,但有另外的线程轮询检查是否io准备完毕,不必等待io完成,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

  Channel:可以看做是IO中的流,但是是双向的,异步读写,必须通过Buffer对象;

  Buffer:它包含一些要写入或者读到Stream对象的;

  Selector:是一个对象,它可以注册到很多个Channel上,监听各个Channel上发生的事件,并且能够根据事件情况决定Channel读写。

  3)AIO(异步非阻塞,连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作)

  异步非阻塞,就只解释下异步,异步就是说我干脆都不等你结果了,直接返回,你有结果了你通知一下我就行。

  异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,每个线程不必亲自处理io,而是委派os来处理,并且也不需要等待io完成了,如果完成后,os会通知的。


作者:王策   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   据报道,美国白宫上周五表示,使用特斯拉充电接口的电动汽车充电站有资格获得数十亿美元的美国联邦补贴,只要这些充电站也支持美国的标准充电接口CCS。  此前,美国汽车巨头福特和通用汽车分别宣布,将采用特斯拉的充电标准,即北美充电标准(NACS)。而白宫最新宣布的举措意味着,美国政府希望通过联邦补贴,推动行业转向有竞争关系的另一大充电标准CCS。  美国政府正在投资最多75亿美元,在美国最繁忙的高速公路上建设新的快速充电设备。这也是特斯拉首次与这个政府投资项目联系在一起。  受此消息影响,特斯拉股价上涨4.1%。分析师表示,福特和通用汽车宣布的决定是特斯拉的重大胜利,可能会使特斯拉的超级充电站成...
            0 0 816
            分享
          • 在面试时,经过寒暄后,一般面试官会让介绍项目经验。常见的问法是,说下你最近的(或最拿得出手的)一个项目。根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的后果。第一印象就不好了,至少会感觉该候选人表述能力不强。一般来说,面试官会根据候选人介绍的项目背景来提问题,假设面试时会问10个问题,那么至少有5个问题会根据候选人所介绍的项目背景来问,候选人如果没说好,那么就没法很好地引导后继问题了,就相当于把提问权完全交给面试官了。面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,所以本文将从“...
            0 0 1691
            分享
          • 一、web测试流程1、需求分析,了解具体需求2、测试准备:原型图、效果图、需求文件、测试用用例、用例评审、各种测试数据准备3、测试环节:接受版本开始执行1)冒烟测试:对版本质量的控制以及此版本是否具备测试条件;2)UI测试:核对效果图3)功能测试:核对需求文件测试用例,对功能进行验证4)兼容测试:各个浏览器,手机是否兼容5)性能测试,服务器接口,多线程等压测6)安全测试7)易用性测试:界面与交互性测试,符合交互规范,用户体验良好,使用方便快捷8)提交bug,争议bug评审,回归测试9)自动化测试a、ui自动化测试:一般使用python+selenium进行ui自动化测试4、发布功能,上线验证,...
            0 0 1352
            分享
          • 读者提问: 『项目交付上线后发生测试漏测事故,谁来背锅 ?』 阿常回答: 首先,这不是一个好问题。(缺失问题背景、你的思考、你真正想问的内容) 再来回答问题: 测试漏测应该由整个团队背锅,因为发生线上事故影响到了公司业务,影响的不是一个人,而是整个集体。 如果一定要选一个人背锅,那就是团队 leader,因为 TA 没有把控好全局。 如果团队中出现了测试漏测现象,阿常会从以下三方面分析原因: 一、测试管理问题 1、确定交付的功能用例没有设计2、确定交付的功能用例设计了,测试没有执行3、确定交付的...
            0 0 973
            分享
          •   埃隆-马斯克(Elon Musk)旗下的社交网络 X 今天对其 API 的定价和限制进行了调整,同时还宣布了具有折扣价的年度计划。该公司将基本 API 层级的价格从 100 美元提高到 200 美元,并表示将为该订阅计划引入更高的限制和新的端点。  在 X 的开发人员社区门户网站上发布的一篇文章中,该公司指出,通过此 API 的读取次数将从 10000 次增加到 15000 次,开发人员还将获得新的端点,如 reposts_of_me 和社区搜索。  但是,在API比较页面和计划购买页面上,API 限制与以前相同。 这可能是一个错误,该公司可能将对该页面进行编辑。  X Developer...
            0 0 116
            分享
      • 51testing软件测试圈微信