Java 四种IO模型
Posted nullPoint水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 四种IO模型相关的知识,希望对你有一定的参考价值。
最近在看netty相关资料。netty是一个高性能,易于开发的NIO框架。在学习netty之前必须得知道java的IO模型。
Java 四种IO模型
IO是主存和外部设备拷贝数据的过程。IO是操作系统底层功能实现,底层通过IO指令完成。Java的四种IO模型有:传统的BIO、NIO、多路复用IO和AIO。
对于一个networkIO,涉及到IO进程与系统内核,当进行read操作时,会经历两个阶段:
等待数据准备
将数据从内核拷贝到进程中。
用户空间是常规进程所在区域,JVM就是常规进程。用户空间时非特权区域,在该区域执行的代码不能直接访问硬件设备。
内核空间时操作系统所在区域,内核代码有特权,它能与设备控制器通讯,控制用户区域进程的运行状态等。所有IO都直接或间接通过内核空间。
BIO
BIO即Blocking I/O。一个读操作流程大概是:
1.通常涉及等待数据从网络中到达,当所有等待数据到达时,它被复制到内核的某个缓冲区。
2.把数据从内核缓冲区复制到应用缓冲区
当用户进程调用了recvfrom,kernel就开始了准备数据阶段。对于networkIO来说,很多情况下数据不是可以立即到达的,kernel需要等到足够的数据到达,而用户进程这边,整个进程会被阻塞。当kernel等到数据准备好,将数据从kernel中复制到用户内存,然后kernel返回结果,用户进程才接触了block状态。所以,blocking IO特点就是IO执行的两个阶段都被block了。
NIO
NIO即non-blockingI/O。一个读流程的流程是:
当用户进程发出read操作时,如果kernel中的数据还没有准备好,它不会block用户进程,而是返回一个error。从用户进程的角度讲,它发起一个read操作后,并不需要等待,而是马上得到了一个结果。用户进程可以再次发出请求,一旦数据准备好了,则进行第二阶段。
IO多路复用
IO复用同非阻塞IO本质一样,不过利用了新的select系统调用,由内核来负责本来是请求进程该做的轮询操作。比非阻塞IO还多了一个系统调用开销,不过由于支持多路IO,所以提高了效率。
当用户进程调用了select,那么整个进程会被block,同时,kernel会监控所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel复制到用户进程。
AIO
用户进程告知kernel启动某个操作,并让kernel在整个操作完成后通知用户进程。
以上是关于Java 四种IO模型的主要内容,如果未能解决你的问题,请参考以下文章