zoukankan      html  css  js  c++  java
  • BIO、NIO、AIO

      这几种类型IO很多人都搞不清楚,虽然外面有很多讲解,但总是不形象、专业词汇太多,我当初反反复复看了好多遍还是不懂,最后只能从入门到放弃。后来慢慢联系到一些实际场景后在回过头来看,我觉得我应该是理解了,再此做个总结。

      先简单介绍下IO,所谓的IO无非就是计算机内存和外设(包括磁盘、网络)之间的数据读写操作,有input和output的操作。其中从磁盘上读取数据都是input,写入数据是output,从网络上读写数据需要依赖socket作为数据载体,可以用inputXXX或者outputXXX等方法。在简单介绍下计算机内存在读写中的一些底层知识,计算机内存可能有很多种分类的维度,我们再此将计算机内存分成应用程序部分和内核部分,所谓的内核部分就是操作系统不让用户访问操作的部分(简单的说,改动这部分会死人的,会把操作系统搞挂的,windows会蓝屏的。但是这部分才是负责真正的底层操作的)。应用程序内存就好比是JVM内存等等(就是应用程序可以访问的内存)。其实Java程序读取数据的过程是Java进程->java应用内存->内核内存->磁盘数据是这个流程,其中访问应用内存是第一步(应用程序发起IO),应用内存访问内核是第二步(执行具体的IO操作)。

      所谓的阻塞非阻塞,是发生在调用IO请求后,如果调用IO请求后,需要等待IO操作完成后才能继续运行的,那就是阻塞了。如果调用IO请求后,不需要等待IO操作完成(在执行IO的过程中可以做其他事),那就是非阻塞了。其实阻塞非阻塞是发生在IO操作的第一阶段的,因此阻塞IO与非阻塞IO的本质是程序是否在等待调用结果(发起IO后,IO的第一阶段)。

      所谓同步非同步,是指IO就绪后,数据从内核态复制到用户态过程中是否需要等待(IO的第二阶段)。

    一、基础概念

    IO操作分为两步:1.发起IO请求;2.执行具体IO操作;

    同步和异步的区别是数据访问时进程是否阻塞或者说在执行真正IO操作时,数据能够立即返回就是异步,否则就是同步,同步和异步发生在IO第二个阶段

    同步和异步的区别在于多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。

    阻塞和非阻塞的区别是应用程序发起IO请求能够被立即返回的就是非阻塞的,不能立即返回的就是阻塞的,阻塞非阻塞发生在IO的第一个阶段

    阻塞和非阻塞的区别关键在于当发出请求一个操作时,如果条件不满足是会一直等待还是返回一个标志信息。就好比我派一个人去做件事,在还没完成前,他会向我反馈任务还没完成,这个是非阻塞;还有一种就是只有等任务完成或者他死了(调用超时)才会给我反馈反馈(请求被挂起)。

      举个你绝对能听懂的栗子:这周老板开恩没让我997(只让我996,我草你妈的狗日的),作为庆祝今天早上打算去楼下新开的面馆吃顿好的,一到面馆看到排队的人是里三层外三层,味道再好的面馆也不至于排成这个鸟样子啊。结果走进一看艹,这家店的排队方式就是脑残,顾客到收银台点面付钱后,一直要等到厨房把面做完送到收银台顾客取完面离开后,下一个顾客才能点单,以此类推(阻塞/非阻塞)。这还了得,像我这种打算点辣肉+辣酱+素鸡+香菇面筋+大肠浇头面的同志来说,肯定会被后面的杀掉的,这个模式就叫BIO。后来给老板提了个改进方案,付完钱后就让下一位点单,嗯,这是个好办法,排队的人一会就少了,但是这群吃饭的人实在是太猴急,点完单坐在座位上不停的问,XXX好了吗,服务员说“没好,等着”,问的次数一多,服务员也火了,大骂“他妈的都烦死了,一个都不许在问了,好了会通知你们的”(多路复用)。由于面馆的人太多,需要好几个人在通知XXX你的面好了自己过来取吧,老板灵机一动,办了个电视屏幕,把所有人的号都在屏幕上显示,大家只要看这屏幕上自己的号有没有被叫到就行了,这个就是IO多路复用。这个例子在不懂你就去附近生意最好的饭店,看下排队点餐和自助叫号。

      然后过了段时间,老板脑袋一拍(其实是屁股一拍),说我们要提升用户体验(要什么狗屁客户第一),说可以送餐到餐桌,也就是说,你付完钱后,可以选择到窗口自取或者坐在座位上等着服务员送餐到餐桌(同步/异步)。所谓的自取(同步),就是窗口大妈说:“辣肉+辣酱+素鸡+香菇面筋+大肠就是那个浇头比面多的那个的面好了,可以过来取了”。所谓的异步就是我付完钱后,就有服务员把我的面送到我的桌子上。

    二、BIO

    BIO就是Block IO,缺点是一个请求开一个线程,请求多了服务器必挂

    三、NIO(Non-Block IO)

    四、IO多数复用:IO多路复用采用Selector来监控多个channel注册的事件,一旦事件就绪,Selector就去通知事件对应的channel。

    五、AIO(异步IO)

    比较好的参考文档:

    1. https://www.cnblogs.com/dolphin0520/p/3916526.html

    2. https://blog.csdn.net/hguisu/article/details/7453390 

    3. http://cmsblogs.com/?p=5875

  • 相关阅读:
    如何利用python制作微信好友头像照片墙?
    机器学习入门路线和资源
    突然“被辞职”的时候,原来可以拿到这么多钱!
    一个致命的 Redis 命令,导致公司损失 400 万
    程序员:想知道你每天按了多少次键盘吗?
    想了解真实的中国历史吗?建议看看这10部历史纪录片,受益终生!
    SpringBlade 2.0-RC3 发布,全新的微服务开发平台
    Syncd-开源自动化部署工具
    学习Spring Boot看这两个开源项目就够了!非得值得收藏的资源
    大型视频直播平台架构由浅入深详细讲解
  • 原文地址:https://www.cnblogs.com/panning/p/9893015.html
Copyright © 2011-2022 走看看