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完成。接下来会调用我们的方法。
网友评论