C++嵌入式内存管理
一个热爱学习的深度渣渣 人气:0前言:
上一篇介绍了软件层面上的内存,并没有涉及很多底层的原理;但在实际工程中,部署一个项目往往需要考虑内存的占用,这里的内存也就是嵌入式板子上的内存;本篇文章就简单介绍一下嵌入式端的一个内存管理;
一、Linux内核系统结构
主要分为五大模块:
本次主要讲解内存管理模块,其他模块不做介绍;
二、查看Linux内存
在Linux环境下,可通过free -m
查看内存使用情况;
下图是一台rk3326机器的内存情况:
Mem
:表示物理内存统计;total
:表示物理内存总量(used + free
);used
:表示总计分配给缓存(包含buffers
与cache)使用的内存数量,但其中部分缓存并未实际使用;free
:未被分配的内存;shared
:内存共享;buffers
:系统分配但未被使用的buffers
数量;cached
:系统分配但未被使用的cache
数量;-/+ buffers/cache
:表示物理内存的缓存统计;Swap
:表示硬盘上交换分区的使用情况;
1.cache
cache
的作用不同于buffer
,它的速度极快,当进行底层优化的时,可能要编写基于cache
的内存管理程序;它是直接与CPU交互的,不用走DDR;
思考以下哪种循环效率高:
// 第一种循环 int arr[10][100]; for (i = 0;, i < 10; i++) for (j = 0; j < 100; j++) arr[i][j] = 8; // 第二种循环 for (i = 0; i <100; i++) for (j = 0; j < 10; j++) arr[j][i] = 8;
从硬件层面来看,第二种的效率最高,因为内存的跳转相对少了很多,所以我们需要注意在嵌套循环中,尽量把大的循环写在内层;
2.buffer
buffer
是缓冲区,作用是开辟一块地址空间,可以将程序需要用到的内存空间先开辟好,有了buffer
可以避免在快速读写时候的问题;
cache和buffer的一个区别:
cache
:把读取过来的数据保存起来,重新读取时若命中,则不需要再去硬盘读取;其中的数据会根据读取频率进行筛选,把频繁读取的数据放在最容易找到的位置,把不在读取的数据往后排,直到删除,这也是LRU缓存算法的原理;buffer
:是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能;
三、内存补齐
在很多嵌入式板子上都有内存对齐的处理;
思考下以下结构占用的内存:
struct A{ char a; // 1 char b; // 1 int c; // 4 }
根据CPU的分配机制,在64位机器上占用8个字节,这也是做了一些对齐处理;
不仅仅是内存,一些板子(例如昇腾310)会对图像数据进行对齐,图像的分辨率要满足硬件支持的倍数,这样才能做到高效处理;
总结:
本篇只是对上一篇内存的一个补充,主要讲解Linux中的内存;这部分对于一些端侧部署的伙伴来说比较重要,推荐针对不同的板子,还是需要先阅读API文档,了解关于内存的API后再进行代码的开发;
加载全部内容