取消初始化内存区域
Des-initializing a region of memory
在过去的几天里,我了解到内存过度使用的问题(当内存过度分配被激活时,这通常是默认值(,这基本上意味着:
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可以满足我的好奇心,我没事。
不,没有办法。
在大多数系统上,一旦您分配内存,它就会计入 RAM 或交换。
如您的链接所示,在 Linux 上,您可能需要访问一次内存,以便实际分配内存。但是一旦您这样做,系统就必须将该内存保持在某处可用,以防您以后访问它。
告诉系统您已完成内存的方法是实际释放它。
相关文章:
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 英特尔将指令存储在重叠的内存区域
- 内存映射区域初始数据
- 指针可以用于访问内存中的任何任意区域吗?
- 具有公共内存区域的类似数组的对象
- 取消初始化内存区域
- MPI_Get仅从共享内存区域读取数组的第一个元素
- 如何将来自闪存中不同银行的两个内存区域交换为STM32L475
- 2D 区域的内存布局
- 从多个线程写入内存区域是否会导致争用?
- 为什么我不能在同一分配中保留两个连续的内存区域,而不通过单个调用保留这两个区域?
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- 为函数设计接口时,强制用户(客户端)提供内存区域 >= 所需大小。怎么做,是好是坏?
- 如何检查迭代器是否形成连续的内存区域
- 如何将 6 字节无符号整数快速复制到内存区域
- 比较快速两个内存区域
- 如何在 Windows 映射程序的 DLL 之前保留内存区域?
- 使用memcpy将整个内存区域克隆到我自己的内存中
- cv::imshow 似乎损坏了一些内存区域
- 使用内存区域作为堆栈空间