Java 四种IO模型

Posted nullPoint水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 四种IO模型相关的知识,希望对你有一定的参考价值。

    最近在看netty相关资料。netty是一个高性能,易于开发的NIO框架。在学习netty之前必须得知道java的IO模型。


Java 四种IO模型

         IO是主存和外部设备拷贝数据的过程。IO是操作系统底层功能实现,底层通过IO指令完成。Java的四种IO模型有:传统的BIONIO、多路复用IOAIO

         对于一个networkIO,涉及到IO进程与系统内核,当进行read操作时,会经历两个阶段:

  1. 等待数据准备

  2. 将数据从内核拷贝到进程中。



         用户空间是常规进程所在区域,JVM就是常规进程。用户空间时非特权区域,在该区域执行的代码不能直接访问硬件设备。

         内核空间时操作系统所在区域,内核代码有特权,它能与设备控制器通讯,控制用户区域进程的运行状态等。所有IO都直接或间接通过内核空间。

BIO

         BIOBlocking I/O。一个读操作流程大概是:

1.通常涉及等待数据从网络中到达,当所有等待数据到达时,它被复制到内核的某个缓冲区。

2.把数据从内核缓冲区复制到应用缓冲区

Java 四种IO模型



         当用户进程调用了recvfromkernel就开始了准备数据阶段。对于networkIO来说,很多情况下数据不是可以立即到达的,kernel需要等到足够的数据到达,而用户进程这边,整个进程会被阻塞。当kernel等到数据准备好,将数据从kernel中复制到用户内存,然后kernel返回结果,用户进程才接触了block状态。所以,blocking IO特点就是IO执行的两个阶段都被block了。

NIO

NIOnon-blockingI/O。一个读流程的流程是:

Java 四种IO模型



         当用户进程发出read操作时,如果kernel中的数据还没有准备好,它不会block用户进程,而是返回一个error。从用户进程的角度讲,它发起一个read操作后,并不需要等待,而是马上得到了一个结果。用户进程可以再次发出请求,一旦数据准备好了,则进行第二阶段。

IO多路复用

         IO复用同非阻塞IO本质一样,不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作。比非阻塞IO还多了一个系统调用开销,不过由于支持多路IO,所以提高了效率。

Java 四种IO模型

         当用户进程调用了select,那么整个进程会被block,同时,kernel会监控所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel复制到用户进程。

AIO

         用户进程告知kernel启动某个操作,并让kernel在整个操作完成后通知用户进程。

以上是关于Java 四种IO模型的主要内容,如果未能解决你的问题,请参考以下文章

四种主要的IO模型

四种IO模型

四种IO模型

四种IO模型

四种IO模型

NIO系列——之IO模型