在过去的几天里,我了解到内存过度使用的问题(当内存过度使用被激活时,这通常是默认设置),这基本上意味着:
void* p = malloc(100);
操作系统为您提供 100 个从进程的(虚拟)地址空间中获取的连续(虚拟)地址,其总范围由操作系统定义。由于该内存区域尚未初始化,因此从系统范围的角度来看,它不算被占用的存储空间,因此除了消耗您的虚拟地址之外,它是一个纯粹的抽象。
memset(p, 0, 5);
它使用前 5 个字节,因此从操作系统的角度来看,您的进程现在占用了 5 个额外字节,因此系统的可用存储空间减少了 5 个字节。您还有 95 字节的未初始化存储空间。
只有当每个进程的合并占用存储(初始化)超出操作系统可以容纳的容量时,系统才会崩溃或开始杀死进程。
如果我在这方面的理解是正确的,有没有办法在你完成后“反”初始化一个内存区域,以增加系统范围的可用空间,而不会丢失malloc
或请求的地址区域aligned_malloc
(所以你不会随着时间的推移增加碎片)?
这个问题的目的是理论上的而不是实际的,而不是实际上“释放内存”,而是在保留已分配的虚拟地址的同时释放内存。
请求虚拟地址和占用存储的区别来源:https ://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6
PD:知道 Linux 可以满足我的好奇心,我很好。