-
Java NIO-10-BIO、NIO、AIO 详解
流的概念和作用
流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象。
流的本质:数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
流的作用:为数据源和目的地建立一个输送通道。
Java 中将输入输出抽象称为流,就好像水管,将两个容器连接起来。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。
...
2018-09-22 04:20:47 |
Java
-
Java NIO-10-大文件读取
背景
直接将文件全部加载到内存,就时候是行不通的。
比如一个文件特别大,直接占用了 2G 的内存,或者相对较大,500M 但是读取不频繁,用户不希望占用太多的内存。
那该怎么办呢?
报错:
五月 06, 2022 10:51:53 上午 org.jboss.netty.channel.socket.nio.AbstractNioSelector
警告: Unexpected exc...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之 Splice
splice()
splice() 是 Linux 中与 mmap() 和 sendfile() 类似的一种方法。
它也可以用于用户应用程序地址空间和操作系统地址空间之间的数据传输。
splice() 适用于可以确定数据传输路径的用户应用程序,它不需要利用用户地址空间的缓冲区进行显式的数据传输操作。
那么,当数据只是从一个地方传送到另一个地方,过程中所传输的数据不需要经过用户应...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之 Sendfile
sendfile()
为了简化用户接口,同时还要继续保留 mmap()/write() 技术的优点:
减少 CPU 的拷贝次数,Linux 在版本 2.1 中引入了 sendfile() 这个系统调用。
sendfile() 不仅减少了数据拷贝操作,它也减少了上下文切换。
首先:sendfile() 系统调用利用 DMA 引擎将文件中的数据拷贝到操作系统内核缓冲区中,然后数据被拷贝到...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之 MMAP
MMAP
在 Linux 中,减少拷贝次数的一种方法是调用 mmap() 来代替调用 read,比如:
tmp_buf = mmap(file, len);
write(socket, tmp_buf, len);
流程
首先,应用程序调用了 mmap() 之后,数据会先通过 DMA 拷贝到操作系统内核的缓冲区中去。
接着,应用程序跟操作系统共享这个缓冲区,这样,操作系统内核和...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之 DMA
DMA
DMA 的好处
在介绍DMA之前我想问大家:我们为什么要引入DMA,DMA对我们有什么好处那?
计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换。
但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。
直接存储器存取(D...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之直接 I/O
直接 I/O 的动机
在介绍直接 I/O 之前,这一小节先介绍一下为什么会出现直接 I/O 这种机制,即传统的 I/O 操作存在哪些缺点。
什么是缓存 I/O (Buffered I/O)
缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。
在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page c...
2018-09-22 04:20:47 |
Java
-
Java NIO-09-零拷贝之写时复制
对应用程序地址空间和内核之间的数据传输进行优化的零拷贝技术
前面提到的几种零拷贝技术都是通过尽量避免用户应用程序和操作系统内核缓冲区之间的数据拷贝来实现的,使用上面那些零拷贝技术的应用程序通常都要局限于某些特殊的情况:要么不能在操作系统内核中处理数据,要么不能在用户地址空间中处理数据。
而这一小节提出的零拷贝技术保留了传统在用户应用程序地址空间和操作系统内核地址空间之间传递数据的技术,但...
2018-09-22 04:20:47 |
Java