取消初始化内存区域



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

void* p = malloc(100);

操作系统为您提供 100 个连续(虚拟(地址,这些地址取自进程的(虚拟(地址空间,其总范围由操作系统定义。由于该内存区域尚未初始化,因此从系统范围的角度来看,它不算作占用存储,因此除了消耗虚拟地址之外,它还是一个纯粹的抽象。

memset(p, 0, 5);

这使用前 5 个字节,因此从操作系统的角度来看,您的进程现在占用了 5 个额外的字节,因此系统的可用存储空间减少了 5 个字节。您仍有 95 字节的未初始化存储。

仅当每个进程的组合存储(初始化(超出操作系统可以容纳的范围时,系统才会崩溃或开始终止进程。

如果我在这方面的理解是正确的,那么有没有办法在完成内存区域时"取消"初始化内存区域,以增加系统范围的可用空间,而不会丢失mallocaligned_malloc请求的地址区域(这样您就不会随着时间的推移增加碎片(?

这个问题的目的更多的是理论而不是实践,不是关于实际"释放内存",而是关于释放内存,同时保存已经分配的虚拟地址。

关于请求虚拟地址和占用存储之间区别的来源:https://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6

PD:知道Linux可以满足我的好奇心,我没事。

不,没有办法。

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

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

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

最新更新