概述
前言
之前发布了一篇Java 读取Excel大文件文章提到了
excel-streaming-reader将原始Excel重新复制到临时文件中来提升性能,这次我们来看下临时文件如何提升了文件操作的性能的。
定义
临时文件系统 (temporary file system, TMPFS) 使用本地内存进行文件系统的读取和写入,但是当临时文件系统的内存到达阈值后操作系统也会将内存交换到外部存储(如硬盘等)。
基于内存的文件系统(Ramdisks )
基于内存的文件系统通常称为Ramdisks 。Ramdisks将文件数据存储在内存中。Ramdisks在处理请求时只需要进行内存到内存的拷贝即可完成,但是这样就造成了两次数据拷贝,因为一般Ramdisks的实现都是将数据保存在自己的私有内存区域,在请求数据时就需要将私有内存区域拷贝到内核内存中。
Ramdisks使用内存也比较低效。Ramdisks直接分配了固定大小的物理内存作为文件数据存储区域,这样Ramdisks内存没有被使用的部分也会一直占用内存从而浪费了内存利用率。Ramdisks的内存与和内核内存隔离的,所以在更新Ramdisks数据时就需要将数据从内核内存拷贝到Ramdisks内存中。
临时文件系统(tmpfs)
临时文件系统能够高效的时候内存。临时文件系统能够提供和RAM disks一样的文件处理速度,因为临时文件系统也是将是将数据存储在内存中(Linux Tmpfs是基于ramfs开发了Tmpfs)。
临时文件系统不会像Ramdisks一样分配固定大小的内存区域,而是基于page cache让操作系统来优化内存的使用。
设计(SunOS)
临时文件系统使用页缓存来存储和维护文件数据。当临时文件系统使用的内存达到阈值时,临时文件系统会将文件数据交换到交换区,交换动作一般是操作系统来处理的。
临时文件设计图:
设计图涉及名词解释
- tmpnode
tmpnode类似于Linux文件系统中的i-node,用来维护文件的元数据,这些元数据包括文件类型、属性和大小。每个文件有一个tmpnode,因为可能会有很多文件,所以tmpnode应该是一张tempnode表,通过这张表可以快速定位文件。
每个tmpnode都会指向一个annomap,操作系统通过annomap来访问文件数据。
目录是tmpnode的特殊实例形式。tempnode如果是目录,那么tmpnode会包含子目录或该目录下文件名及对应的tmpnode指针。
- anonymous memory
anonymous memory使用来描述业结构的,它并不是文件系统的一部分。一般anonymous memory分配的数量不能超过交换区的大小(这里的数量我理解的是对应的页数)。
- anon 结构
anon结构是anonymous memory和交换设备的结构,用来存储anonymous memory对应的页交换到哪个交换设备和交换到这个设备的什么偏移位置。
- anon_map
anon_map是anon结构的集合,通过anon_map来查找需要访问的页。
- 页
虚拟存储模型中,物理内存被划分为页框,一般一个页框为4KB。用户进程地址空间使用页面,称为虚拟地址空间。页面与页面通过页表做关联。
- vnode
vnode是对被打开文件的一个描述结构。普通文件可以通过内存映射将文件数据映射到内存中。
根据自己的理解重画设计图
以下过程都是根据自己理解整理。
创建文件过程
- 通过索引节点集合查找索引节点,找到返回;找不到则创建索引节点
- 创建空的文件页集合(也可延迟到文件写入时)
- 创建打开节点并方位到打开节点集合
写文件
- 从打开节点集合找到打开节点
- 通过打开节点找到索引节点
- 从索引节点找到文件页集合
- 根据写入偏移找到文件页和页内写入位置
- 写入数据
读文件
- 从打开节点集合找到打开节点
- 通过打开节点找到索引节点
- 从索引节点找到文件页集合
- 根据写入偏移找到文件页和页内读取位置
- 根据读取大小读取数据
特性
- 基于内存,读写速度快
- 功能完整,基础的文件操作都支持(比如:创建、删除、查找、读写、重命名等等)
- 重启系统、用户手动释放文件或取消挂载文件系统后文件数据会丢失
实验
实验基于Linux。
查看临时文件系统
[root@xxxx ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 8031168 0 8031168 0% /dev
tmpfs 8044488 0 8044488 0% /dev/shm
tmpfs 8044488 813496 7230992 11% /run
tmpfs 8044488 0 8044488 0% /sys/fs/cgroup
tmpfs 1608900 0 1608900 0% /run/user/0
查看空闲页
[root@xxxx~]# cat /proc/meminfo | grep Shmem
Shmem: 583588 kB
总结
- 临时文件系统基于内存进行文件系统的组织性能高。
- 临时文件系统的使用操作系统页,页是否交换到交换区由操作系统根据当前内存情况进行换入换出。
- 临时文件系统还会使用内存映射来避免二次拷贝(二次拷贝为将数据拷贝到内核缓冲区,然后再拷贝到用户缓冲区,反之亦然)。
总之,性能高。