Q:Java 中的缓冲区原理是什么?
A:如果是边读边写,就会很慢,也伤硬盘。 缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入 ,类似数据库的批量操作,这样效率比较高。
调用 I\O 操作的时候,实际上还是一个一个的读或者写,关键就在,CPU 只有一个,不论是几个核心。CPU 在系统调用时,会不会还要参与主要操作?参与多次就会花更多的时间。
系统调用时,若不用缓冲,CPU 会酌情考虑使用、中断。此时 CPU 是主动地,每个周期中都要花去一部分去询问 I\O 设备是否读完数据,这段时间 CPU 不能做任何其他的事情(至少负责执行这段模块的核不能)。所以,调用一次读了一个字,通报一次,CPU 腾出时间处理一次。
而设置缓冲,CPU 通常会使用 DMA 方式去执行 I\O 操作。CPU 将这个工作交给 DMA 控制器来做,自己腾出时间做其他的事,当 DMA 完成工作时,DMA 会主动告诉 CPU“操作完成”。这时,CPU 接管后续工作。在此,CPU 是被动的。DMA 是专门 做 I\O 与 内存 数据交换的,不仅自身效率高,也节约了 CPU 时间,CPU 在 DMA 开始和结束时做了一些设置罢了。
所以,调用一次,不必通报 CPU,等缓冲区满了,DMA 会对 C PU 说 “嘿,伙计!快过来看看,把他们都搬走吧”。
综上,设置缓冲,就建立了数据块,使得 DMA 执行更方便,CPU 也有空闲,而不是呆呆地候着 I\O 数据读来。从微观角度来说,设置缓冲效率要高很多。尽管,不能从这个程序上看出来,几万字的读写 \ 就能看到差距。

Q:DMA 是什么意思?
A:DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。