如何解决第一次将页面加载到物理内存是否会导致主要页面错误?
假设我们有一个刚刚创建的进程 A,它分配了 SIZE 字节。
例如
ptr = malloc( SIZE )
我知道这个缓冲区将被保留在进程的虚拟进程空间中,我的问题是:我们第一次写入这个缓冲区时会出现主要页面错误吗?如果是,为什么?
更新:这是在 ArchLinux 上使用 gcc 完成的。
解决方法
我们第一次写入这个缓冲区时会出现主要页面错误吗?如果是,为什么?
您可能会也可能不会在第一次写入时遇到一个正常的页面错误。
这取决于哪个操作系统(以及 malloc()
的哪个实现);但我希望(对于大多数操作系统和 malloc()
的大多数实现):
-
malloc()
导致创建虚拟页面,其中这些虚拟页面是相同的物理页面,其中充满了零,在许多虚拟地址上多次映射为“只读”(有点像使用镜子使它看起来像一个香蕉是一个装满香蕉的房间)。 -
当你第一次写入其中一个页面时,你得到一个页面错误,操作系统分配一个新的物理页面,用零填充它,并将它映射到虚拟地址中的适当地址空间为“读/写”(替换旧的“只读”页面充满零)。
-
这可能发生在每个单独的虚拟页面上(例如,写入一个虚拟页面不会导致任何其他虚拟页面被分配或“读/写”)。但是,操作系统可能(如果有大量空闲 RAM,和/或如果操作系统检测到易于预测的“顺序写入”模式),在写入之前预先分配物理页面(以避免将来出现页面错误);并且操作系统可能会决定使用不同的/更大的页面大小(例如,它可能会分配一个 2 MiB 的“大页面”而不是分配 4 KiB 的页面)。
-
对于
malloc()
的某些实现(以及SIZE
的某些值),某些虚拟内存可能已经在malloc()
期间分配和映射(例如因为 {{1 }} 在分配块的开始处写了一个header 并导致页面错误本身)。 -
以后可能会出现更多页面错误(例如,如果在分配页面的第一次写入时出现一个页面错误;然后分配页面中的数据可能会被发送到交换空间以稍后释放物理页面,并且那么后续的读取或写入将导致更多的页面错误从交换空间中获取数据)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。