热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

嵌入式Linux内存使用与性能优化

1.怎样查看系统当前可用内存?答:使用free命令即可。如下图所示:说明:buffers:主要用来给Linux系统中块设备做缓冲区(把分散的写操作集中进行,减少对磁盘或者Flash设备

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  #include  #include   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 即可知道需要释放的内存大小是多少。



原文转自:乐搏学院http://www.learnbo.com/front/article/cmsIndex

原文转自:乐搏学院http://www.learnbo.com/front/article/cmsIndex
推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
author-avatar
笑竹舞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有