从查看内存开始

通过proc查看

#cat /proc/meminfo
MemTotal:         220976 kB
MemFree:          206188 kB
MemAvailable:     205556 kB
Buffers:             204 kB
Cached:             1412 kB
SwapCached:            0 kB
Active:             2232 kB
Inactive:            148 kB
Active(anon):        760 kB
Inactive(anon):        4 kB
Active(file):       1472 kB
Inactive(file):      144 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         220976 kB
...

通过 free 查看

#free -mtotal         used         free       shared      buffers
Mem:           215           14          201            0            0
-/+ buffers:                 14          201
Swap:            0            0            0

重点关注的项目:
free:空余的物理内存的空间
available:用户应用程序可以使用的物理空间
(通常为 buff/cache + free,不过这个是由偏差的)
page cache:文件系统的缓冲
buffer chche:磁盘等块设备的缓冲

问题

为什么需要虚拟内存

如果不使用虚拟内存,当物理内存不够时,程序就无法跑起来

虚拟内存,给用户提供了那些基本机制

给每个进程提供了4Gb的内存空间

既然每个进程都有4G的内存空间,为什么会出现物理内存不足,需要拓展内存

当malloc需要的内存超过,物理空闲内存和交换空间的大小时,是无法分配内存的。4G只是最大大小,很多嵌入式系统,是根本无法分配如此大的空间的。并且,当所有的物理内存都被虚拟内存映射使用时,继续使用就需要将物理内存的数据写回到文件系统中,或者放到交换分区,这样会十分的浪费时间,系统使用将会非常卡顿。

既然由虚拟内存机制,为什么还需要交换分区,什么时候将会使用交换分区

并不是所有从物理内存中交换出来的数据都会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写,当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中了,而可以直接将其放到文件里去。如果是读文件操作,那么内存数据被直接释放,不需要交换出来,因为下次需要时,可直接从文件系统恢复;如果是写文件,只需要将变化的数据保存到文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名”(Anonymous)内存数据。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间。
交换分区是为了缓解内存不足,没有交换分区,系统也是可以正常运行的。

虚拟内存和缓存

缓存和虚拟内存,没啥关系,无论有没有虚拟内存,都需要缓存

  1. 因为代码段,数据段都需要拷贝到,内存中,cpu才可以执行。
  2. 因为cpu 和 磁盘之间的处理速度相差太大,使用缓冲可以缓解压力,提高系统效率。
    没有虚拟内存,就缓存在物理内存上,有虚拟内存,就从物理内存再次映射到虚拟内存上。如果系统访问的虚拟内存内容,还没有加载到物理内存中,就会触发缺页异常。需要注意的使bufferd 和 cached。他们的使用如图片所示:

什么的缺页异常

指定访问的虚拟page,不在物理内存中,就会触发缺页异常:
page fault的种类:
segment fault : 进程访问的地址不在虚拟空间里属于越界访问。
hard page fault: 访问的内存不在物理内存中,需要从存储设备加载进内存中。
minor page fault: 访问的内存不在虚拟内存中,需要重新建立映射关系。

如何手动消除缓冲

缓冲占用的内存过大时,可以通过
sync
echo 1 > /proc/sys/vm/drop_caches

虚拟内存有什么好处

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处
2.共享内存,使用虚拟内存机制,共享内存将会极为方便,两个进程的虚拟地址空间,都只向通过一块物理内存就可以实现,内存共享。
3.内存保护,通过虚拟内存机制可以,使每个进程都有独立的内存空间,不受干扰。

vmalloc kmalloc malloc

这几个的区别,可以参考下面的文章。
关键点,vmalloc kmalloc是内核空间的,malloc是用户空间的。
https://www.cnblogs.com/arnoldlu/p/8251333.html

Linux 虚拟内存 交换空间相关推荐

  1. Linux虚拟内存交换空间,Linux 添加 Swp 虚拟内存交换空间

    当 Linux 服务器的内存不够使用时,可以文件或者分区来当作虚拟内存,比如在测试机或者自己学习用的机器上,跑的服务比较多,又没有必要搞那么好(贵)的机子,添加swp交换空间也是一个不错的选择. 首先 ...

  2. linux swap 交换空间 设置多大合适

    无论是windows系统还是linux系统,除了物理内存外,都还有一个虚拟内存.在linux上,虚拟内存被称为swap space.过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内 ...

  3. linux系统交换空间,Linux中如何使用和管理交换空间

    给计算机配置交换空间可以充分利用系统,在物理内存被充满时使用,那么Linux下要如何使用Linux交换空间呢?Linux交换空间又要如何管理呢?下面小编就给大家介绍下Linux下使用交换空间的方法,一 ...

  4. linux 增加交换空间,在linux上增加swap交换空间

    增加交换空间有两种方法: 严格的说,在系统安装完后只有一种方法可以增加swap,那就是本文的第二种方法, 至于第一种方法应该是安装系统时设置交换区. 1.使用分区: 在安装OS时划分出专门的交换分区, ...

  5. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_1整起(进程线程协程并发并行、进程线程切换进程间通信、死锁\进程调度策略、分段分页、交换空间、OS三大调度机制)

    PART0:OS,这货到底是个啥? OS,是个啥? OS的结构们: 存储器: 存储器的层次结构: 内存:我们的程序和数据都是存储在内存,我们的程序和数据都是存储在内存,每一个字节都对应一个内存地址.内 ...

  6. linux交换分区的文件格式为,linux利用交换分区空间类提供虚拟内存,交换分区的文件系统类型必须是() (5.0分)...

    2021-03-06 10:21郑州新闻网编辑:admin人气: linux利用交换分区空间类提供虚拟内存,交换分区的文件系统类型必须是() (5.0分) 物业服务企业资质一级企业的注册资本为300万 ...

  7. Linux 交换空间管理和技巧

    UNIX 如何使用交换空间 所有 UNIX 操作系统都支持某种虚拟内存 (VM) 系统.使用 VM 系统,您有两个主要区域来存储有关活动应用程序及其使用的数据的信息--物理随机访问存储器 (RAM) ...

  8. linux交换空间使用率,linux编程系统中交换空间的使用情况

    计算机的存储空间问题相信大部分的管理员都有不同的处理方式.今天我们就一起来了解一下,在linux系统中,交换空间的具体使用情况是什么.希望通过对本文的阅读,大家对于linux系统有更多的了解,下面就开 ...

  9. linux 交换空间(space space)详解

    内存和磁盘简介 正常的linux操作系统一般有两种内存,第一种就是我们熟知的RAM(random access memory),它是用来存储一段时间内频繁使用的数据和文档,电脑是不能直接读写非内存的东 ...

最新文章

  1. 紧急求助!配置SMTP插件出错,SMTP connect() failed
  2. java中executorservice_java中ExecutorService创建方法总结
  3. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略
  4. java webpack_webpack将对象暴露为全局
  5. 使用IntelliJ IDEA看源码的时候,如何在优雅的查看类继承关系...【看这篇就够了】
  6. JavaScript逻辑运算符的使用技巧
  7. 第三十三章 机械化印刷
  8. Android eclipse中程序调试
  9. VC++ (MFC)调用 C#生成DLL的两种方法
  10. MATLAB解决常微分方程
  11. cad看图软件看图软件哪个好?
  12. u盘 安装win11 提示找不到 install.wim 文件 解决方法
  13. 云栖社区Markdown指南【2018版】
  14. 程序员撩妹,你得看我教你的小技巧
  15. 神经网络入门(连载1-6)
  16. 2016 GitHub章鱼猫观察报告之开源统计
  17. adaboost训练 之 强分类器训练原理
  18. while语句和do...while语句
  19. 大数据治理平台建设规划方案
  20. IdentityServer4 DiscoveryClient找不到

热门文章

  1. 文档是怎么在线翻译的?
  2. [书摘]游戏开发核心技术-剧本和角色创造
  3. Java判断是中文还是英文
  4. 3D转换(位移,旋转)
  5. 图片自动轮播+上拉加载下拉刷新+侧滑菜单+小圆点
  6. Apifox接口自动化测试方法
  7. 人力资源管理系统(eHR)有何作用?
  8. 在无控制点的条件下如何用RTK定线定位
  9. 免费米拓cms插件自动采集发布推送
  10. 数字经济之数字技术八大金刚