Linux和Java中的I/O模型

在了解Java中的I/O模型之前,我们来了解一下Linux中的I/O模型。

用户空间和内核空间

Linux为了保证系统安全,把内存分为了两种空间,分别是用户空间内核空间。只有内核空间可以直接调用硬件(比如磁盘,网卡等)。

而我们一般的进程是在用户空间的,位于用户空间的进程是不能直接调用硬件的,而是通过系统调用来请求内核空间协助完成IO操作。

那内核空间是怎么协助的呢?内核空间会为每个IO设备维护一个缓冲区buffer(比如文件系统IO,就是页缓存page cache)。内核收到来自用户空间的进程的系统调用请求后,从IO设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间。我们以读取数据为例,可以把它分为两个阶段:

  • 准备数据:把数据从磁盘或网卡填充到内核空间的buffer里;
  • 拷贝数据:把数据从内核空间拷贝到用户空间。
同步阻塞模型

同步阻塞模型是最简单的IO模型,准备数据拷贝数据这两个阶段都是阻塞的,所以说性能不高,应用场景也非常有限。
在这里插入图片描述

同步非阻塞模型

同步非阻塞的意思是发出指令之后立即可以得到一个相应,不需要阻塞等待。通过轮循的方式不断去获取结果,如果得到了结果就进行下一步处理,否则继续轮循。缺点是过度浪费CPU资源。
在这里插入图片描述

IO多路复用模型

这里"复用"指的是:使用同一个线程,"多路"指的是:多个网络连接。使用IO多路复用模型只需要一个线程就可以操作多个网络连接。

Linux中,提供了selectpollepoll三种接口函数来实现IO多路复用。Linux 2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术。尽管它们的使用方法不尽相同,但是本质上却没有什么区别。其中select和poll有一些缺陷,它们会随着IO连接性能的增加,性能不断下降。所以现在一般都是使用epoll。

当用户进程调用了epoll,那么进程会被等待,内核中一个或者多个FD(文件句柄,也叫做文件描述符,FileDescription,简称FD)就绪了,epoll就会返回。这个时候进程再进行下一步的拷贝数据阶段。
在这里插入图片描述

异步IO模型

其实上述三种IO严格来讲都是“同步的”,因为尽管它们有些在第一阶段实现了IO的非阻塞,但第二阶段仍然都是阻塞的。

异步IO在两个阶段都是非阻塞的。所以又称为“异步非阻塞IO”。如下图所示:
在这里插入图片描述

Java中的BIO模型

在Java 1.4以前,只有一种IO模型,就是BIO(Blocking-IO,阻塞IO)。所以当时Java在处理高并发时性能并不好,通常使用多线程+阻塞IO来实现Web Server,然后使用线程池协助。比如Tomcat就是基于这个原理。

BIO相关的类和接口就是我们在入门Java的时候通常会了解到的InputStreamOutputStreamReaderWriter等等。

BIO虽然性能不高,但编程比较简单。如果你的程序对性能要求不大,可以考虑使用BIO。

Java中的NIO模型

在Java 1.4的时候,JDK提供了对NIO的支持。NIO底层是使用的上述的“IO复用”模型,也就是基于epoll。事实上目前很多高性能的服务或框架都用到了epoll,比如nginx,redis,nodejs等等。

NIO主要有这三个概念:

  • Channel
  • Buffer
  • Selector

基本上,所有的 IO 在NIO 中都从一个Channel 开始。 数据可以从Channel读到Buffer中,也可以从Buffer 写到Channel中。
在这里插入图片描述
Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。
在这里插入图片描述

Java中的AIO模型

AIO即异步IO,Java AIO是在JDK 1.7引入的,也被称为NIO 2.0。JAVA AIO框架在windows下使用windows IOCP技术,在Linux下使用epoll多路复用IO技术模拟异步IO。

感兴趣的同学可以先看看这篇文章:《Java aio 编程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值