本文主要是介绍[用户态内存] 共享内存1---tmpfs和ramfs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.ramfs
- 2.tmpfs
- 3 ramfs和tmpfs性能对比和异同
1.ramfs
ramfs是Linux下一种基于RAM做存储的文件系统,由于ramfs的实现就相当于把RAM作为最后一层的存储,所以在ramfs中不会使用swap。linux os看ramfs就像看普通硬盘一样,所以ramfs有一个较大缺陷就是它会吃光os的内存,哪怕你在mount时已经指定了该ramfs的大小。由于上述缺陷,ramfs只能root用户访问。
ramfs创建
mkdir -p /dev/myRamFs
mount -t ramfs none /dev/myRamFs
或
mkdir -p /myRamFs
#大小限制无效
mount -t ramfs none /myRamFs -o maxsize=10000
2.tmpfs
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/myshm mount -t tmpfs -o size=1024M tmpfs /dev/myshm #resize大小 mount -size=64M -o remount /dev/myshm #查看相关信息 df -lh
3 ramfs和tmpfs性能对比和异同
同等环境条件下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的异同
- ramfs空间不会被限制,会因为数据的不断写入而自动增长空间,直到内存耗尽;而tmpfs在mount时可以限制空间大小,不会自动增长(但可以通过"mount -o remount …")。
- ramfs不会用swap,tmpfs会用swap
- ramfs和tmpfs都用于提升性能,但tmpfs性能更佳
参考:
https://www.cnblogs.com/milton/p/11541260.html
这篇关于[用户态内存] 共享内存1---tmpfs和ramfs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!