从磁板/闪存单元到本地Java变量,单字节读取需要很长的路要走.这是单个字节传输的路径:
>磁性板/闪存单元
>内部硬盘缓冲区
> SATA / IDE总线
> SATA / IDE缓冲区
> PCI / PCI-X总线
>计算机的数据总线
>计算机的RAM通过DMA
> OS Page-cache
> Libc读缓冲区,又称用户空间fopen()读缓冲区
>本地Java变量
出于性能原因,操作系统完成的大部分文件缓冲都保留在页面缓存中,将最近的读写文件内容存储在RAM上.
这意味着Java代码中的每个读写操作都是从本地缓冲区完成的:
FileInputStream fis = new FileInputStream("/home/vz0/F.txt");
// This byte comes from the user space buffer.
int oneByte = fis.read();
页面通常是4KB内存的单个块.每个页面都有一些特殊的标志和属性,其中一个是“脏页面”,这意味着页面有一些未写入物理媒体的修改数据.
一段时间后,当操作系统决定将脏数据刷回磁盘时,它会以相反的方向发送数据.
只要两个不同的进程将数据写入同一文件,结果就是:
>如果文件被锁定,则不可能.第二个进程将无法打开该文件.
>未定义,如果写在文件的同一区域.
>如果在文件的不同区域运行,则预期.
“区域”取决于应用程序使用的内部缓冲区大小.例如,在两兆字节的文件上,两个不同的进程可能会写:
>第一个1kB数据(0; 1024).