Linux堆分配

4
FreeRTOS中,堆只是一个全局数组,大小(我们称之为heapSize)在一个H文件中定义,用户可以更改。这个数组是一个非初始化的全局数组,这使它成为镜像的BSS部分的一部分,因此在加载时填充了零,然后每次分配内存都从这个数组中进行,并且每个分配内存的地址都是这个数组的偏移量。

因此,为了最大利用内存大小,我们可以近似估算整个程序的DataTextBSS区域的大小,并将堆的大小定义为heapSize = RAM_size - Text_size - Data_size - BSS_size

我想知道Linux OS中的等效实现是什么。Linux能否扫描给定的RAM并在运行时决定其大小?Linux是否有相应的数据结构来管理堆?如果有,它如何为该数据结构分配内存?


4
Linux的内存管理过于复杂,无法在StackOverflow的问答格式中充分描述。最重要的是,Linux是一个虚拟内存操作系统,将地址空间分为内核和用户空间,并为每个空间使用了不同的内存分配方法。 - datenwolf
1
http://www.johnchukwuma.com/training/UnderstandingTheLinuxKernel3rdEdition.pdf - Oliver Charlesworth
您的程序可以读取“/proc/meminfo”文件来确定实际内存和已使用内存的数量。 - stark
Linux允许以页面粒度(用于进程内存和一些大型系统内存区域)和结构/缓冲粒度进行分配,其中使用可用的分配器之一:SLAB / SLUB(实际上不是堆而是相同大小块的列表列表)和SLOB(更简单,针对性或嵌入式)。 - myaut
2个回答

2

0

Linux中的堆是动态的,因此它会在您请求更多内存时增长。这可以通过使用交换文件来扩展到物理内存大小之外,其中一些未使用的RAM部分被写入磁盘。

因此,我认为您需要更多地考虑“我的应用程序需要多少内存”而不是“有多少可用内存”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接