我想知道这一点,因为如果进程 A 可以 malloc 50 兆未清零的数据,并且该内存块原来包括来自进程 B 的物理页面并且仍然包含处理 B 的数据。
最佳答案
Is malloc'd data zeroed in objective c?
大部分是。有一个零页写入器,它是内存管理器的一部分,它提供一个带有零页的进程。内存管理器将调用 memory_object_data_unavailable
告诉内核为该区域提供零填充内存。
如果进程调用 free
,然后再次调用 mallocs
,页面不会重新归零。清零仅在需要新页面时发生。事实上,页面可能不会在 free
时返回给系统。由于运行时,该进程保留该页面供自己使用。相关见Will malloc implementations return free-ed memory back to the system?
如果一个页面在内存不足的情况下返回给系统,即使该进程以前持有该页面,该页面也会被重新置零。内存管理器不考虑页面的最后所有者。它只是假定新页面需要归零以避免跨进程信息泄漏。
请注意,Microsoft 将其称为零页编写器。 Darwin 有相同的组件,但我不记得看到它的名字。另见 Mac OS X Internals: A Systems Approach由辛格。它有点过时,但它提供了很多系统信息。第 8 章,内存,是感兴趣的一章。
Singh 的书详细介绍了其他细节,例如需要页面但不需要归零的情况。在这种情况下,进程之间有一些共享数据,并且在写时复制(COW)方案下为进程分配了一个新页面。实际上,新页面是从现有数据而不是零数据填充的。感兴趣的函数是 memory_object_data_request
。
Linux 在 Some ado about zero 上对零页进行了有趣的讨论。 .关于一个表面上看似平凡的话题的有趣阅读。
关于ios - malloc 的数据是否在 objective-c 中归零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44914794/