Java IO 底层原理

作者: YQ_1024 | 来源:发表于2019-02-22 22:31 被阅读232次

    1.Java的IO操作都是由操作系统来执行的,且发生在内核空间

    2.用户空间和内核空间

    • 用户空间就是JVM的堆(进程的内存空间)在这里的程序和指令是访问IO是--被限制的,只能通过内核去访问硬件;

    3.整个IO的操作流程如下

    IO原理图
    • (1)用户进程发起read调用,操作系统接收到调用后,会创建一个缓冲区,用来存放需要读取的数据,同时向IO设备(设备控制其)发送读取指令(包括读哪些内容)
    • (2)IO硬件接收到指令后,进行读取,并把数据通过DMA(直接存取器)放入内核空间的缓冲区中
    • (3)操作系统将内核缓冲区中的数据拷贝到用户空间的缓存中。调用结束

    4.IO的模型

    (1)阻塞IO

    • 当硬件设备没有准备好、或者内核缓冲区没有满的时候,就会发生阻塞。例如
      ServerSocker.accept()方法,在没有请求来的时候就会一直阻塞。
      当调用socket.getOutPutStream.write()方法的时候,如果数据量过小。需要调用flush方法,强制将缓存中的数据发送出去


      阻塞IO

    (2)NIO(非阻塞IO)

    • 当使用非阻塞IO模型的时候,如果数据不可以,直接返回,当前线程不会等待数据可用,过一会儿再来取数据


      BIO模型

      (3)多路复用IO(selector)
      多路复用IO是基于NIO的,我们通过一个选择器进行轮询,轮询前相关IO会向selector注册。轮询中发现有可用的IO的时候,进行IO处理
      (4)AIO(异步IO)
      可以理解成有一个异步线程来通知我们的IO操作,当数据准备好之后,回调我们的接口。和NIO的区别是:NIO是主动去轮询转台,AIO是被动去调用


      AIO模型
      (5)同步IO和异步IO的区别
      同步IO一定会执行从内核拷贝数据到用户进程,如果NIO模型,当没有数据的时候,是不会阻塞的,但是有数据的时候,拷贝这个动作是会阻塞的。NIO、BIO、多路复用IO都是同步IO

    异步IO是指,用户进程发起IO操作之后不用理会了。直到等到操作系统发起一个消息告诉进程,IO完成。接下来会调用我们的方法。

    相关文章

      网友评论

        本文标题:Java IO 底层原理

        本文链接:https://www.haomeiwen.com/subject/oppyyqtx.html