[用户态内存] 共享内存1---tmpfs和ramfs

2024-05-25 09:48

本文主要是介绍[用户态内存] 共享内存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有下列用法:

  1. tmpfs总会存在一些用户态根本看不到内核内部挂载,这些用于共享匿名映射和SYSV共享内存。并且这种tmfs的mount是不依赖 CONFIG_TMPFS 内核配置的,也就是如果没有配置CONFIG_TMPFS ,用户态是不能构建tmpfs的,但内核态中该机制是存在的。

  2. 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的异同

  1. ramfs空间不会被限制,会因为数据的不断写入而自动增长空间,直到内存耗尽;而tmpfs在mount时可以限制空间大小,不会自动增长(但可以通过"mount -o remount …")。
  2. ramfs不会用swap,tmpfs会用swap
  3. ramfs和tmpfs都用于提升性能,但tmpfs性能更佳

参考:

https://www.cnblogs.com/milton/p/11541260.html

这篇关于[用户态内存] 共享内存1---tmpfs和ramfs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001160

相关文章

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils