0

在过去的几天里,我了解到内存过度使用的问题(当内存过度使用被激活时,这通常是默认设置),这基本上意味着:

 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 可以满足我的好奇心,我很好。

4

1 回答 1

0

不,没有办法。

在大多数系统上,一旦您分配内存,它就会计入 RAM 或交换。

正如您的链接所示,在 Linux 上,您可能需要访问一次内存,以便实际分配内存。但是一旦你这样做了,系统必须在某处保留该内存,以防你以后访问它。

告诉系统您已完成内存的方法是实际释放它。

于 2019-08-26T19:34:10.407 回答