• 图解I/O模型


      本文带你鸟瞰I/O模型全貌,希望可以让你对I/O模型有一个直观的认识

    什么是I/O?I/O的过程?同步阻塞 I/O同步非阻塞 I/OI/O多路复用异步I/O

    什么是I/O?

      I/O就是计算机内存和外部设备之间拷贝数据的过程。
      那么I/O模型主要解决的问题是什么呢?程序通过CPU,请求外部设备上的数据。而数据拷贝到内存里需要一定的时间,在这个时间里,程序是主动让出CPU时间?还是让CPU不断的去查数据是否是到了?
      I/O模型就是用来解决这个决策问题。

    I/O的过程?

      首先我们要明白。I/O通讯涉及到两个非常重要的对象。
      1.程序执行时的用户线程
      2.操作系统内核
      操作系统将进程的地址空间分为用户空间内核空间,用户线程是没有办法从内核空间直接获取数据,需要将数据从内核空间拷贝到用户空间,再获取用户空间的数据。
      所以任何I/O模型,网路数据的读取都可以分为2部分。
      1.用户线程等待内核将网卡中的数据,拷贝到内核空间
      2.内核将数据从内核空间拷贝到用户空间。
      各个I/O模型的区别就是实现这两个步骤的方法不同

    同步阻塞 I/O

      用户线程发起read请求后就阻塞了,让出CPU,内核会等待网卡数据的到来,然后吧数据拷贝到内核空间,从内核空间拷贝到用户空间,再唤醒用户线程。

    同步非阻塞 I/O

      用户线程不断发起read请求,数据没到内核空间时,每次都返回失败,直到数据到了内核空间,此时再调用read会阻塞,等待内核将内核空间的数据拷贝到用户空间,再唤醒用户线程。

    I/O多路复用

      这里把用户线程的读取操作分为了2步,线程先发送select调用,问内核是否将数据准备好了,等数据准备好了,用户线程再发起read调用,在等待数据从内核空间拷贝到用户空间这段时间里,线程仍是阻塞的,一次select请求可以向内核查询多个数据通道(channel)的状态,所以才叫多路复用

    异步I/O

      用户发起的read调用,会注册一个回调函数,read立即返回,等到内核将数据准备好后,调用回调函数完成处理,整个过程中,用户线程一直没有被阻塞

      最后,期待您的订阅和点赞,专栏每周都会更新,希望可以和您一起进步,同时也期待您的批评与指正!

  • 相关阅读:
    217. Contains Duplicate (leetcode)
    242. Valid Anagram(leetcode)
    JVM的逃逸分析
    有 a
    Maven 项目管理从未如此通畅
    Spring学习手札(四)谈谈Spring Bean的生命周期及作用域
    Spring学习手札(三)理解IoC 拯救不开心
    Spring学习手札(二)面向切面编程AOP
    Spring学习手札(一)
    Java提供了哪些IO方式?IO, BIO, NIO, AIO是什么?
  • 原文地址:https://www.cnblogs.com/nedulee/p/12563063.html
Copyright © 2020-2023  润新知