RandomAccessFile使用详解 MappedByteBuffer使用详解 共享内存

2020-06-04 21:05:00
admin
原创 2320
摘要:RandomAccessFile使用详解 MappedByteBuffer使用详解 共享内存

一、RandomAccessFile使用详解

1、用于随机读和随机写;

2、提供多种数据类型的读和写;


特殊说明:

bytes = new byte[8];
output.write(bytes, 0, 0); //可以写0字节

byte[] bytes = null;
output.write(bytes, 0, 0); //会触发抛异常


二、MappedByteBuffer使用详解

FileInputStream.read(byte b[])执行过程:

1、从磁盘拷贝到内核缓冲区;
2、从内核缓冲区拷贝到JVM直接缓冲区;
3、从JVM直接缓冲区拷贝到堆内存;

4、如果参数是直接缓冲区,则省略步骤三;


内存映射文件原理:

1、内核地址和用户地址映射到同一个物理地址,这样DMA硬件可以填充对内核和用户空间进程同时可见的缓冲区;

2、内存映射方式读取文件只执行一次内存拷贝,即磁盘到内核缓冲区,避免调用文件操作系统调用,效率非常高;


MappedByteBuffer实现细节:

1、RandomAccessFile维护一个FileChannel实例,实例在调用getChannel时创建,getChannel方法是同步方法

2、MapMode.PRIVATE映射模式会导致写时拷贝,调用写操作会导致产生私有内存副本;

3、MappedByteBuffer实际是子类DirectByteBuffer实例,因此并不消耗JVM堆内存;

4、load方法进行文件预加载,不保证文件一定全部加载,isLoaded方法表示文件可能已经全部加载;

5、force方法强制将缓冲区的内容写到磁盘上面;

6、示例代码:SharedMemory.java


FileChannel实现细节:

truncate方法在windows上执行失败,在linux上执行成功,文件inode不变;


FileLock实现细节:

1、FileChannel的lock和trylock方法可以创建文件锁,lock是阻塞方法;

2、文件锁支持区域锁定,shared为true时创建读写锁,操作系统不支持时会创建独占锁,可以使用isShared测试;

3、锁的状态对操作系统的其他进程可见,对进程内的其他线程也可见;


Linux文件锁:

1、sys/file.h的flock,支持独占锁读写锁,不支持对文件指定区域加锁;

2、fcntl.h的fcntl,支持独占锁和读写锁,支持对文件指定区域加锁;

3、unistd.h的lockf,只支持独占锁,不支持对文件指定区域加锁,实际调用fcntl

4、查看/proc/locks可以查看文件锁信息,FLOCK对应flock,POSIX对应fcntl;

5、默认锁的类型是劝告锁ADVISORY,而非强制锁,如果是劝告锁其他进程还是可以操作文件;

发表评论
评论通过审核之后才会显示。