本文共 2068 字,大约阅读时间需要 6 分钟。
ramfs是Linux下一种基于RAM做存储的文件系统,由于ramfs的实现就相当于把RAM作为最后一层的存储,所以在ramfs中不会使用swap。linux os看ramfs就像看普通硬盘一样,所以ramfs有一个较大缺陷就是它会吃光os的内存,哪怕你在mount时已经指定了该ramfs的大小。由于上述缺陷,ramfs只能root用户访问。
ramfs创建
mkdir -p /dev/myRamFsmount -t ramfs none /dev/myRamFs
或
mkdir -p /myRamFs#大小限制无效mount -t ramfs none /myRamFs -o maxsize=10000
tmpfs是一个将所有文件保存在虚拟内存中的一个临时文件系统。tmpfs中的所有内容都是临时的,因为tmpfs储存依托并不是硬盘而是内存。如果我们umount一个tmpfs实例,那么存储在其中的所有内容将丢失。(tmpfs puts everything into the kernel internal caches)
因为tmpfs存储的内容都是通过VM(Virtual Memory)管理的,所以tmpfs的文件存储介质包括真实的物理内存和swap磁盘,但在swap中的读写速度相对于物理内存要慢很多。由上可知tmpfs的最大存储空间为系统物理内存空间+swap空间,但是tmpfs本身并不知道实际使用的空间是物理内存还是swap磁盘空间。
tmpfs有最大容量限制,但是我们也可以通过"mount -o remount …"命令对tmpfs的容量大小进行调整。
如果要比较tmpfs和ramfs的区别,那就是ramfs不会使用swap,另外ramfs创建后没有容量大小的限制,存在耗尽内存的风险。
另外一类与tmpfs相似的东西是RAM disk(/dev/ram*),它是将内存中一块固定大小的区域用来模拟一块硬盘。在使用RAM disk前,你必须在它上面创建一个ordinary filesystem 。Ram disk不能使用swap空间,也不能动态调整它的空间大小。
因为tmpfs中所有的内容存储在page cache或swap空间中,因此tmpfs在cat /proc/meminfo命令中显示为"Shmem",而在free命令中显示为"Shared"。需要注意的是上面命令的计算方式包括了shared memory(shmen,see ipcs(1))。因此获取他们最可靠的方式是通过df和du命令。
tmpfs有下列用法:
tmpfs总会存在一些用户态根本看不到内核内部挂载,这些用于共享匿名映射和SYSV共享内存。并且这种tmfs的mount是不依赖 CONFIG_TMPFS 内核配置的,也就是如果没有配置CONFIG_TMPFS ,用户态是不能构建tmpfs的,但内核态中该机制是存在的。
glibc2.2及以上版本期望tmpfs被挂载到/dev/shm上,用于POSIX共享内存(shm_open,shm_unlink).若想linux os启动默认tmpfs挂载到/dev/shm,需要添加下列内容到文件/etc/fstab中的某一行中:
tmpfs /dev/shm tmpfs defaults 0 0
当然我们也可以在shell终端自定义创建tmfs文件目录:
mkdir /dev/myshmmount -t tmpfs -o size=1024M tmpfs /dev/myshm#resize大小mount -size=64M -o remount /dev/myshm#查看相关信息df -lh
同等环境条件下tmpfs在性能方面优于ramfs。因为ramfs是将内存作为虚拟文件系统的底层存储介质,那么当一个进程使用ramfs时处理数据时会有这样一条数据处理路径:
RAMFS -> PAGE CACHE -> 进程
对于tmpfs,因为采用虚拟内存实现的,则tmpfs被认为没有后备设备(backing store)。那么当一个进程使用tmpfs时处理数据时会有这样一条数据处理路径:
TMPFS -> 进程 (tmpfs充当page cache的作用)
通过以上的设计,tmpfs相较于ramfs就少了一次page cache到RAM的数据拷贝,虽然内存间的数据拷贝很快,但这些操作也会增加ramfs的时耗。因此在性能上tmpfs优于ramfs。
ramfs与tmpfs的异同
参考:
转载地址:http://dpbgi.baihongyu.com/