用 memset() 写入的内存在不调用 free() 的情况下会在内存中保留多长时间?

Posted

技术标签:

【中文标题】用 memset() 写入的内存在不调用 free() 的情况下会在内存中保留多长时间?【英文标题】:How long does memory written with memset() stay in memory without calling free()? 【发布时间】:2019-08-03 02:39:01 【问题描述】:

在 Linux 上。

嗨。我敢肯定有很多因素涉及操作系统只是垃圾转储分配给 memset() 的内存而不调用 free(),但我想知道是否有人对此有很好的估计?这就是我想知道的。

Linux 中有一个称为 KSM 的功能,它通过组合匹配的数据来节省内存空间。我的问题围绕着通过检查数据的写入时间来检测 KSM 是否正常工作。我已经在一台机器上成功地测试了这个,同时在一个程序中运行所有东西。现在我想上传到内存,关闭程序,然后打开另一个程序并测试内存重复。

谢谢!

-泰勒

【问题讨论】:

【参考方案1】: memset 不分配内存,malloc 可以 内存在空闲调用或进程终止之前不会被释放 C 中没有抽象机,这就是语言的设计原则

【讨论】:

你说“直到进程终止”,这是否意味着一旦c程序运行完毕,内存就会被释放? 您知道将内容保存在内存中的方法吗?我的意思是,我可以让程序休眠。 @Tdizzle:你到底想达到什么目的? 只要进程存在,内存就不会被回收。这实际上取决于操作系统,但通常也是如此。 @HenningMakholm,我正在制作一个检测恶意 VM 的程序【参考方案2】:

让我们谈谈抽象:

C 程序员为“C 抽象机”编写软件。这与任何真正的硬件无关。

“C 抽象机”被转换为在某种“进程”抽象中运行的东西(例如可执行文件)。这种“进程”抽象与任何真正的硬件无关(它使用“线程”而不是真正的 CPU、“虚​​拟内存”而不是真正的 RAM、“文件”而不是真正的磁盘空间……)。

操作系统在机器之上创建“进程”抽象。对于 KSM(操作系统在虚拟机中运行),这种“虚拟机”抽象与任何真实硬件无关。

现在;让我们将“抽象”定义为旨在保护人们免受现实影响的故意谎言(我们也将“安全漏洞”定义为谎言中的缺陷)。

确定“C 抽象机中的内存”与实际物理资源(RAM 芯片、磁盘空间等)在任何时间点的关系;您需要突破至少 3 个故意设计的障碍,以阻止您了解这段关系。

【讨论】:

嗯好的,你能告诉我这 4 个障碍是什么吗? @Tdizzle:D'oh - 这是 3 个障碍(在 4 个抽象之间) - 将纠正这一点。具体来说; “C 抽象机”和“过程”之间的障碍;在“进程”和“虚拟机”之间,在“虚拟机”和“物理机”之间。 请注意,KSM 在最低级别运行 - 它(字面意思)在 2 个或更多虚拟机中查找相同的页面,然后对每个虚拟机撒谎(让虚拟机中的操作系统继续认为它拥有该页面的独占所有权,而实际上它没有)。 ohh k,所以你是说所有的抽象都是出于安全原因?对吗? @Tdizzle:部分原因是出于安全考虑。其他是为了可移植性、向后或向前兼容性、管理复杂性、易于学习和调试、性能、业务原因(划分谁资助和开发系统的哪些部分),或者因为某某是我们一直这样做的方式。抽象的原因不止一个。

以上是关于用 memset() 写入的内存在不调用 free() 的情况下会在内存中保留多长时间?的主要内容,如果未能解决你的问题,请参考以下文章

对二维数组的“memset”的混淆和“free”的错误

C - free() 或 memset() 为零和 free()?

可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?

使用 C 测量内存写入带宽

为啥可以用空指针调用free?

在 memset 之后未写入结构数组的值