在过去的几天中,我了解到内存过度承诺的问题(当激活内存过度提交时,这通常是默认的),这基本上意味着:
void* p = malloc(100);操作系统为您提供了来自进程(虚拟)地址空间的100个连续(虚拟)地址,其总范围是OS定义的。由于该内存区域尚未初始化,因此从系统范围的角度来看,它并不算为受限的存储,因此它是一个纯粹的抽象,除了使用您的虚拟地址。
memset(p, 0, 5);它使用前5个字节,所以从操作系统的角度来看,您的进程占用了5个额外的字节,因此系统的空闲存储少了5个字节。您仍然有95字节未初始化的存储。
只有当每个进程的组合存储(初始化)超出操作系统所能容纳的范围时,系统才会崩溃或开始终止进程。
如果我在这方面的理解是正确的,那么是否有一种方法来“des”--在完成内存区域时初始化内存区域,以增加系统范围内的空闲空间,而不放松malloc或aligned_malloc请求的地址区域(这样就不会随着时间的推移而增加碎片)?
这个问题的目的更多的是理论而不是实际的“释放内存”,而是关于在保存已经分配的虚拟地址的同时释放内存。
关于请求虚拟地址和ocuppying存储之间区别的来源:https://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6
PD:知道了,为了满足我的好奇心,我没事。
发布于 2019-08-26 19:34:10
不,不可能。
在大多数系统上,一旦分配内存,它就会被计算为RAM或交换。
如您的链接所示,在Linux上,您可能需要访问一次内存,以便实际分配内存。但是一旦你这样做了,系统就必须把这个内存保存在某个地方,以防你以后访问它。
告诉系统你已经完成了内存的方法是真正释放它。
https://stackoverflow.com/questions/57663305
复制相似问题