• Linux的tmpfs和ramfs


    tmpfs

    tmpfs是一种虚拟内存文件系统, 它的存储空间在VM里面,现在大多数操作系统都采用了虚拟内存管理机制, VM(Virtual Memory) 是由Linux内核里面的VM子系统管理. VM的大小由RM(Real Memory)和swap组成, RM就是物理内存, swap是通过硬盘虚拟出来的内存空间, 大小是可以配置的. swap的读写速度相对RM(Real Memory)要慢许多. 在物理内存不足时一个进程申请内存, 内核的VM子系统就会把RM里面的一些不常用的数据交换到swap里面, 在需要使用这些数据时再从swap交换到RM里.
    tmpfs最大可用的存储空间等于 RM + swap, 但是tmpfs本身不知道实际使用的空间是RM还是swap.

    mkdir /tmp/memory
    mount -t tmpfs -o size=1024M tmpfs /tmp/memory
    

    上面的命令分配了1GB的VM到/tmp/memory目录下, 可以用df命令查看. tmpfs一个优点就是它实际使用的空间是随着实际存储的数据而变化的, 如果/tmp/memory目录下什么也没有, tmpfs并不占用VM. 参数1024m只是告诉内核这个挂载点最大可用的VM为1024m, 如果不设置这个参数, tmpfs默认的大小是RM的一半, 假如物理内存是8GB,那么tmpfs默认的大小就是4GB.

    实际应用一: 将内存挂载到文件系统

    #手动挂载:
    mount -t tmpfs -o size=2g tmpfs /tmp/tbls
    #启动时自动挂载: 修改/etc/fstab,添加如下一行
    tmpfs /tmp/tbls tmpfs size=2g 0 0
    

    实际应用二: 快速消耗内存. 下面的脚本将占用1GB内存1个小时, 注意需要root权限

    #!/bin/bash
    mkdir /tmp/memory
    mount -t tmpfs -o size=1024M tmpfs /tmp/memory
    dd if=/dev/zero of=/tmp/memory/block
    sleep 3600
    rm /tmp/memory/block
    umount /tmp/memory
    rmdir /tmp/memory
    

    ramfs

    ramfs是Linux下一种基于RAM做存储的文件系统, 可以把ramfs理解为在普通的HDD上建立了一个文件系统, 而现在HDD被替换成了RAM. 因为是RAM做存储所以会有很高的读写速度. 在ramfs中不会使用swap. 但是ramfs有一个问题是它会吃光系统所有的内存, 即使mount时指定了大小. 同时它只能被root用户访问.

    sudo mount -t ramfs -o size=10M ramfs ./ramfs/
    sudo dd if=/dev/zero of=./ramfs/test.file bs=1M count=20
    

    测试时你会发现上面这个操作是能成功的,如果直接写一个比内存更大的文件,你会发现瞬间系统就卡住了. 另外dd命令必须要有root权限

    dd: opening `./ramfs/test.file': Permission denied
    

    df只使用h选项是无法显示ramfs的内容的, 要用-a参数

    linux-numy:~ # df -ah | grep "/mnt/ram"
    ramfs 0 0 0 - /mnt/ram
    

    ramfs与tmpfs的区别是:

    • 达到空间上限时可以继续写入
    • 非固定大小
    • 不会使用swap
    # 不指定大小则为内存大小
    mount -t tmpfs tmpfs /tmp/mem1/
    # ramfs需要使用df -a 或 mount -t ramfs 选项才能查看到,大小都是0,但不影响使用
    mount -t ramfs ramfs /tmp/mem1/
    

    .

  • 相关阅读:
    两种代理模式(JDK和Cglib)实例
    打印1到最大的n位数
    二叉树的构建以及先中后序遍历
    二维数组的查找
    斐波那契递归和非递归俩种算法实例
    淘宝tairKV分布式
    OSI七层模型详解
    Spring事务配置的五种方式
    linux中cat、more、less、tail、head命令的区别
    跨域的理解与实现
  • 原文地址:https://www.cnblogs.com/milton/p/11541260.html
Copyright © 2020-2023  润新知