[用户态内存] 共享内存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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

逆向学习汇编篇:内存管理与寻址方式

本节课在线学习视频(网盘地址,保存后即可免费观看): ​​https://pan.quark.cn/s/3ceeb9ae6d98​​ 在汇编语言的世界中,内存管理和寻址方式是构建程序的基础。理解这些概念不仅对于编写高效的汇编代码至关重要,也是进行逆向工程分析的关键技能。本文将深入探讨内存管理的基本原则和多种寻址方式,并通过代码案例来展示它们的实际应用。 1. 内存管理 内存管理涉及如何分配

Win10用户必看:最好用最稳定的版本在此,值得一试!

在Win10电脑操作中,用户可以根据的需要,下载安装不同的系统版本。现在,许多用户好奇Win10哪个版本最好用最稳定?接下来小编给大家推荐最好用最稳定的Win10版本,这些系统版本经过优化升级,相信会给大家带来最棒的操作体验感,且下载安装步骤非常简单。   推荐一:Windows10 22H2 X64 官方正式版   点击下载:https://www.xitongzhijia.net/wi

段,页,段页,三种内存(RAM)管理机制分析

段,页,段页         是为实现虚拟内存而产生的技术。直接使用物理内存弊端:地址空间不隔离,内存使用效率低。 段 段:就是按照二进制文件的格式,在内存给进程分段(包括堆栈、数据段、代码段)。通过段寄存器中的段表来进行虚拟地址和物理地址的转换。 段实现的虚拟地址 = 段号+offset 物理地址:被分为很多个有编号的段,每个进程的虚拟地址都有段号,这样可以实现虚实地址之间的转换。其实所谓的地

插入用户APC

每个_Kthread都有一个成员Alerted,默认为0,表示是否可以被APC唤醒。所以下面这段程序,即使插入了APC,但是t线程仍然不会执行。 让t线程执行APC函数的方法是使t线程变成可被唤醒状态,使用函数SleepEx(时间,是否可以唤醒线程),第二个参数为true,Alerted设置为1,即可被唤醒;在插入APC时,APC函数就会执行。 #include "stdafx.h"#inc

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if

Netty ByteBuf 释放详解:内存管理与最佳实践

Netty ByteBuf 释放详解:内存管理与最佳实践 在Netty中(学习netty请参考:🔗深入浅出Netty:高性能网络应用框架的原理与实践),管理ByteBuf的内存是至关重要的(学习ByteBuf请参考:🔗Netty ByteBuf 详解:高性能数据缓冲区的全面介绍)。未能正确释放ByteBuf可能会导致内存泄漏,进而影响应用的性能和稳定性。本文将详细介绍如何正确地释放ByteB

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专