1.  怎样查看系统当前可用内存 ?

答:使用 free 命令即可。如下图所示:

说明:

buffers: 主要用来给Linux系统中块设备做缓冲区(把分散的写操作集中进行,减少对磁盘或者Flash设备的写次数,提高系统性能)

cached:用来缓冲打开的文件(把从磁盘或者Flash中读取的数据保存在内存中,若再次读取该块时,则直接从内存中读取而不需要再访问磁盘或者Flash设备)

在系统中内存是很宝贵的资源,故Linux在内存使用上的宗旨是:如果内存充足,不用白不用,尽量使用内存来缓存一些文件,从而加快进程的运行速度;而当内存不足的时候,这些内存又会被回收,供程序使用。

所以,当前系统真正空闲可以使用的内存为:free+buffers+cached (KB)

2.  free命令得到的数据是哪里来的?

答: 来自 /proc 虚拟文件系统,我们可以通过 /proc/meminfo文件来了解当前系统的内存使用情况,如下图所示:

从上面可以看出,系统一共有 2050600KB的物理内存,当前系统可用的物理内存为: Memfree+Buffers+Cached

3.  操作系统的虚拟内存与物理内存机制

操作系统为程序员屏蔽了物理内存的使用,在32位操作系统中,每个进程面对的都是4GB的内存空间,称为虚拟内存。操作系统采用了延迟分配物理内存的策略,针对进程的内存分配请求,它只是在内核中分配了一段虚拟地址,只有当确实使用这块内存时,系统才会为其分配物理地址。

我们来看一下下面这段代码:

#include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {     char * p = (char *)malloc(10);      char * q = (char *)malloc(200);      strcpy(p,"123");      return 0;  }

问题一:该代码执行时,内存的分配过程是怎样的?

(1)  char * p= (char *)malloc(10);

char *q =  (char *)malloc(200);

这2句,系统只给该进程分配了虚拟内存,而并没有分配物理内存。

(2)  strcpy(p,"123");

这一句,由于进程需要真正使用这块内存了,因此系统会产生一个页故障,从而为该进程分配一个物理页面。

(3)  整个程序最终只是为 p 分配的物理内存,而只是给 q 分配了虚拟内存。

问题二: 该代码实际分配的内存究竟多大?

系统给该进程分配的虚拟内存为 : 10B + 200B = 210 Byte

给该进程分配的物理内存为 4KB,因为系统规定,分配物理内存的最小单位为一个物理页面,一般是4KB

注:用户态申请内存是以Byte为单位,而内核态申请内存是以页面(4KB)为单位

4.  Linux的内存回收机制

在Linux系统中,有一个专门的守护进程 kswapd,它会定期地检查系统中空闲内存的数量,一旦发现空闲内存数量小于一个阈值的时候,就会将若干页面换出,存放到交换分区中,以腾出足够的内存空间。

对于交换分区的使用,有着如下的规则:

对于那些没有被改写过的页面,这块内存不需要写到交换分区上,可以直接回收。

对于那些已经改写的页面,我们称之为脏页面(dirty page),则需要写到交换分区。

但在使用Flash作为存储介质的嵌入式设备中,一般没有交换分区,因此对于dirty page,只能保留在系统中,无法换出。原因如下:

(1) 一旦使用了交换分区,系统的性能会下降很快,不可接受

(2) Flash的写次数是有限的,大概在几十万次,如果在Flash上面建立交换分区的话,必然导致对Flash的频繁读写,进而影响Flash的寿命。

下面分析下,一个进程中,哪些内存可能是 dirty page 页面,哪些不是?

(1) 代码段,其权限是只读属性,不可能被改写,所以其所占的物理内存,都不是 dirty page

(2) 数据段,其权限是可读、可写,所以其所占的物理内存可能是 dirty page,也可能不是

(3) 堆栈段,其没有对应的映射文件,内容都是通过程序来改写的,所以其所占的物理内存全部是 dirty page

(4) 共享内存,其所占的物理内存,全部是 dirty page

综上所述,也就是说, 可以直接被回收的内存,主要是进程的代码段和未修改的数据段。

5.  为什么在 malloc时,要求输入申请的空间大小,而在 free 时,不需要输入释放的空间大小?

因为程序调用 malloc 函数申请内存时,并不是直接向操作系统申请,而是先由 glibc 的内存管器模块接收请求,它再通过系统调用向内核申请一块内存并将地址p返回给用户,同时,在 p-4 这个地址记录下 malloc 空间的大小,glibc 在 free 这块内存的时候,通过 p-4 即可知道需要释放的内存大小是多少。

本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/817545,如需转载请自行联系原作者

嵌入式Linux内存使用与性能优化相关推荐

  1. 《嵌入式linux内存使用与性能优化》读书笔记

    <嵌入式linux内存使用与性能优化>读书笔记 前言 本书的重点分为系统内存和性能优化,前4章着重内存使用,尽量减少进程的内存使用量,定位和发现内存泄漏:后5章着重与如何让系统性能优化,加 ...

  2. 《嵌入式Linux内存使用与性能优化》笔记

    <嵌入式Linux内存使用与性能优化>笔记 这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相 ...

  3. 嵌入式linux内存使用和性能优化

    这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...

  4. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)

    Linux + JVM + Mysql高级性能优化课程 课程名称:      Linux + JVM + Mysql高级性能优化 QQ群:      243242580(小白.菜鸟勿进)跟Java.M ...

  5. c语言嵌入式编程修炼 pdf,C语言嵌入式系统编程修炼之性能优化.pdf

    C 语言嵌入式系统语言嵌入式系统编程修炼之性能优化编程修炼之性能优化 使用宏定义使用宏定义 在 C 语言中 宏是产生内嵌代码的唯一方法 对于嵌入式系统而言 为了能达到性能 要求 宏是一种很好的代替函数 ...

  6. Android手机内存管理与性能优化

    Android手机内存管理与性能优化&JNI.NDK高级编程(JNI.Dalvik.内存监测) 课程分类:Android 适合人群:中级 课时数量:34小节课时 用到技术:Dalvik,DDM ...

  7. 嵌入式Linux内存压力测试

    原文参考:添加链接描述 1 前言   内存是电子计算机的最重要组成要素之一. 与内存对应的就是外存,如硬盘.外部存储器等.内存是将外存与CPU连接起来的桥梁,计算机中所有数据都需经过内存进行交互,而且 ...

  8. C语言嵌入式系统编程修炼之六性能优化

    在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误 ...

  9. Linux问题分析与性能优化

    目录 排查顺序 方法论 性能分析工具 CPU分析思路 内存分析思路 IO分析思路 网络分析思路 基准测试工具 参考 排查顺序 整体情况: top/htop/atop命令查看进程/线程.CPU.内存使用 ...

  10. Java内存泄漏、性能优化、宕机死锁的N种姿势

    导读 本文介绍Java诸多优化实例:第一,排查堆上.堆外内存泄露:第二,使用arthas.jaeger.tcpdump.jstack做性能优化:第三,排查进程异常退出的原因,如被杀.System.ex ...

最新文章

  1. 三菱工业机器人rv6s_FANUC机器人控制器—维护三要素
  2. Linux命令(一)
  3. MySQL-处理重复数据[20180517]
  4. ubuntu安装环境软件全文档
  5. sql 数字转换为16进制数函数
  6. 单点登陆(SSO)组件的设计与实现一 【转】
  7. Elasticsearch 2.3.0 重建索引
  8. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
  9. tcp/ip网络协议学习
  10. 魔鬼训练Day2作业
  11. ubuntu文件名乱码(转载)
  12. 【文化课每周学习记录】2019.4.7——2019.4.13
  13. matplotlib报错:Glyph 25151 (\N{CJK UNIFIED IDEOGRAPH-623F}) missing from current font. func(*args)
  14. Linux下CAN总线通信调试记录
  15. 利用.htaccess文件实现不带www域名301跳转到带www域名
  16. php药膳 源码,5款药膳方治疗关节炎
  17. 推荐系统 --- 推荐算法 --- 其他
  18. QT5——模版库、工具类及控件
  19. 计算机毕业设计Android新闻RSS阅读器客户端app(源码+系统+mysql数据库+Lw文档)
  20. matlab将.mat数据文件转换成.dat/.txt数据文件

热门文章

  1. 直播技术总结(二)ijkplayer的编译到Android平台并测试解码库
  2. dubbo k8s 服务发现_记一次dubbo服务发现导致的OOM
  3. php 便利字符串,Go语言遍历字符串——获取每一个字符串元素
  4. java技术 ppt_Java技术简介与基本宣告ppt课件.ppt
  5. python字典修改属性_Python2.7格式化字典键属性的递归调用
  6. oracle 删除数据_Oracle海量数据表标准删除方案--分步分阶段大表删除
  7. 华为发布了其自研的鸿蒙操作系统,官宣!鸿蒙手机操作系统即将发布
  8. 上海戏剧学院开学计算机考试,2021年上海戏剧学院大一新生转专业及入学考试相关规定...
  9. delphi和python和halcon_【《zw版·Halcon与delphi系列原创教程》Halcon图层与常用绘图函数...
  10. mysql所选路径已经存在_5分钟安装好MySQL数据库(建议收藏)